Difference between revisions of "User:JanosA"
From ArmadeusWiki
Line 18: | Line 18: | ||
== RS485 == | == RS485 == | ||
− | + | Informations and mini HOWTOs for my APF28/iMX28 mxs-auart and busybox stty patches. | |
+ | === Linux stty === | ||
* Setup APF28 serial port for RS485 communication: | * Setup APF28 serial port for RS485 communication: | ||
<pre class=apf> | <pre class=apf> | ||
Line 46: | Line 47: | ||
Please note: | Please note: | ||
* You can't set the "rs485delaylastchartx" parameter, it's calculated automatically from the baudrate. | * You can't set the "rs485delaylastchartx" parameter, it's calculated automatically from the baudrate. | ||
− | Special notes | + | Special notes for the APF28/iMX28 mxs-auart driver: |
* All delays are in microseconds. | * All delays are in microseconds. | ||
* The "rs485delaylastchartx" parameter is not used in DMA mode. | * The "rs485delaylastchartx" parameter is not used in DMA mode. | ||
* The parameters: "rs485rtsonsend" "rs485rtsaftersend" "rs485rxduringtx" are not used. | * The parameters: "rs485rtsonsend" "rs485rtsaftersend" "rs485rxduringtx" are not used. | ||
+ | * If the RS485 mode is turned on, it will override (turn off) the RTS/CTS hardware flow settings of the uart, don't care what is configured. | ||
− | + | === C code === | |
* The RS485 mode can be turned on with ioctl calls from C code, here is the example: | * The RS485 mode can be turned on with ioctl calls from C code, here is the example: | ||
<source lang="C"> | <source lang="C"> | ||
Line 101: | Line 103: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | === Hardware Notes === | ||
+ | * The RS485 Transmit Enable (TXEN) output will be the RTS pin of the uart. | ||
+ | * The TXEN/RTS output is _active low_, it must be inverted to use it with the popular RS485 transceiver ICs. | ||
+ | * When the u-boot runs and the board start to boot, the RTS pin works as input, please add a pullup resistor to this pin before the inverter, to prevent RS485 bus lockups. |
Revision as of 22:46, 6 May 2013
I am IP Network and Datacenter engineer, currently I'm working for an Internet Service Provider in Hungary.
My hobby is programming embedded systems and creating my own small electronic boards.
Contents
Skills
- Assembly programming: PIC 8bit family
- C programming: PIC 8bit / PIC32MX family, Linux
- Perl, PHP, Javascript, Html programming with MySQL
- Linux system administration
- RS-232/485 serial communications: Ascii, Modbus, Saia Sbus, etc.
- IP networking
My ArmadeuS plans (APF28 based)
- Creating an universal home automation hardware for my friends, with easy programming in perl or PHP. :)
- Datacenter temperature monitoring, with RS-485 and OneWire communications.
- Data logger for Saia Sbus based intelligent power meters.
RS485
Informations and mini HOWTOs for my APF28/iMX28 mxs-auart and busybox stty patches.
Linux stty
- Setup APF28 serial port for RS485 communication:
# stty -F /dev/ttySP0 raw # stty -F /dev/ttySP0 -echo -echoe -echok # stty -F /dev/ttySP0 rs485
- Set extra delays for TXEN/RTS signaling before and after the transmitted packet (in microseconds):
# stty -F /dev/ttySP0 rs485delaybefore 100 # stty -F /dev/ttySP0 rs485delayafter 100
- To get current RS485 parameters. (If the port device supports the RS485 options you will see the last two lines)
# stty -F /dev/ttySP0 speed 9600 baud; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -brkint -imaxbel rs485 -rs485rtsonsend -rs485rtsaftersend -rs485rxduringtx rs485delaybefore = 100; rs485delayafter = 100; rs485delaylastchartx = 1250;
Please note:
- You can't set the "rs485delaylastchartx" parameter, it's calculated automatically from the baudrate.
Special notes for the APF28/iMX28 mxs-auart driver:
- All delays are in microseconds.
- The "rs485delaylastchartx" parameter is not used in DMA mode.
- The parameters: "rs485rtsonsend" "rs485rtsaftersend" "rs485rxduringtx" are not used.
- If the RS485 mode is turned on, it will override (turn off) the RTS/CTS hardware flow settings of the uart, don't care what is configured.
C code
- The RS485 mode can be turned on with ioctl calls from C code, here is the example:
#include <stdio.h>
#include <fcntl.h>
#include <linux/ioctl.h>
#include <linux/serial.h>
#include <asm-generic/ioctls.h> /* TIOCGRS485 + TIOCSRS485 ioctl definitions */
int main(void) {
struct serial_rs485 rs485conf;
int fd = open ("/dev/ttySP0", O_RDWR);
if (fd < 0) {
printf("Error: Can't open: /dev/ttySP0\n");
}
/* Don't forget to read first the current state of the RS485 options with ioctl.
If You don't do this, You will destroy the rs485conf.delay_rts_last_char_tx
parameter which is automatically calculated by the driver when You opens the
port device. */
if (ioctl (fd, TIOCGRS485, &rs485conf) < 0) {
printf("Error: TIOCGRS485 ioctl not supported.\n");
}
/* Enable RS485 mode: */
rs485conf.flags |= SER_RS485_ENABLED;
/* Set rts/txen delay before send, if needed: (in microseconds) */
rs485conf.delay_rts_before_send = 0;
/* Set rts/txen delay after send, if needed: (in microseconds) */
rs485conf.delay_rts_after_send = 0;
if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
printf("Error: TIOCSRS485 ioctl not supported.\n");
}
fcntl(fd, F_SETFL, 0);
int n = write(fd, "ABC\r\n", 5);
if (n < 0) {
/* Error handling */
}
if (close (fd) < 0) {
printf("Error: Can't close: /dev/ttySP0\n");
}
}
Hardware Notes
- The RS485 Transmit Enable (TXEN) output will be the RTS pin of the uart.
- The TXEN/RTS output is _active low_, it must be inverted to use it with the popular RS485 transceiver ICs.
- When the u-boot runs and the board start to boot, the RTS pin works as input, please add a pullup resistor to this pin before the inverter, to prevent RS485 bus lockups.