|
|
| (8 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| | == About Me == |
| I am IP Network and Datacenter engineer, currently I'm working for an Internet Service Provider in Hungary. | | I am IP Network and Datacenter engineer, currently I'm working for an Internet Service Provider in Hungary. |
|
| |
|
| Line 16: |
Line 17: |
| * Data logger for Saia Sbus based intelligent power meters. | | * Data logger for Saia Sbus based intelligent power meters. |
|
| |
|
| | | == My works comitted to ArmadeuS project == |
| == RS485 == | | * [[RS-485]] for APF28/iMX28 mxs-auart and busybox stty patch |
| Informations and mini HOWTOs for my APF28/iMX28 mxs-auart and busybox stty patches.
| | * [[OneWire GPIO bus Master]] for APF28DEV |
| | |
| === Linux stty ===
| |
| * Setup APF28 serial port for RS485 communication: | |
| <pre class=apf>
| |
| # stty -F /dev/ttySP0 raw
| |
| # stty -F /dev/ttySP0 -echo -echoe -echok
| |
| # stty -F /dev/ttySP0 rs485
| |
| </pre>
| |
| | |
| * Set extra delays for TXEN/RTS signaling before and after the transmitted packet (in microseconds):
| |
| <pre class=apf>
| |
| # stty -F /dev/ttySP0 rs485delaybefore 100
| |
| # stty -F /dev/ttySP0 rs485delayafter 100
| |
| </pre>
| |
| | |
| * To get current RS485 parameters. (If the port device supports the RS485 options you will see the last two lines)
| |
| <pre class=apf>
| |
| # 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;
| |
| </pre>
| |
| 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:
| |
| <source lang="C">
| |
| #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");
| |
| }
| |
| }
| |
| </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.
| |