Rev 1575 | Rev 1750 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1575 | Rev 1582 | ||
|---|---|---|---|
| Line 15... | Line 15... | ||
| 15 | #endif |
15 | #endif |
| 16 | 16 | ||
| 17 | // internal variables |
17 | // internal variables |
| 18 | static uint32_t baudRate = 9600; |
18 | static uint32_t baudRate = 9600; |
| 19 | static uint16_t format = CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK; |
19 | static uint16_t format = CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK; |
| - | 20 | static uint8_t databits = 8; |
|
| - | 21 | static uint8_t stopbits = 1; |
|
| - | 22 | ||
| - | 23 | static enum { |
|
| - | 24 | PARITY_NONE = 0, |
|
| - | 25 | PARITY_EVEN = 1, |
|
| - | 26 | PARITY_ODD = 2, |
|
| - | 27 | } parityMode; |
|
| 20 | 28 | ||
| 21 | // prepare a new message, in case new data is available |
29 | // prepare a new message, in case new data is available |
| 22 | static StdCan_Msg_t msg; |
30 | static StdCan_Msg_t msg; |
| 23 | 31 | ||
| 24 | #define sns_Serial_DEBUG 0 |
32 | #define sns_Serial_DEBUG 0 |
| - | 33 | ||
| - | 34 | ||
| - | 35 | #ifndef min |
|
| - | 36 | #define min(_a,_b) ((_a)<(_b) ? (_a) : (_b)) |
|
| - | 37 | #endif |
|
| - | 38 | ||
| - | 39 | #ifndef max |
|
| - | 40 | #define max(_a,_b) ((_a)>(_b) ? (_a) : (_b)) |
|
| - | 41 | #endif |
|
| - | 42 | ||
| - | 43 | #ifndef lim |
|
| - | 44 | #define lim(_a,_minval,_maxval) (max(min((_a),(_minval)),(_maxval))) |
|
| - | 45 | #endif |
|
| 25 | 46 | ||
| 26 | 47 | ||
| 27 | 48 | ||
| 28 | uint8_t sns_Serial_setSettings(void) |
49 | uint8_t sns_Serial_setSettings(void) |
| 29 | { |
50 | { |
| Line 39... | Line 60... | ||
| 39 | gpio_clr_pin(sns_Serial_485_232); // RS232 mode |
60 | gpio_clr_pin(sns_Serial_485_232); // RS232 mode |
| 40 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
61 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
| 41 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
62 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
| 42 | } |
63 | } |
| 43 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485FULLDUPLEX) |
64 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485FULLDUPLEX) |
| 44 | { |
65 | { |
| 45 | #if sns_Serial_DEBUG==1 |
66 | #if sns_Serial_DEBUG==1 |
| 46 | printf("RS485FD\n"); |
67 | printf("RS485FD\n"); |
| 47 | #endif |
68 | #endif |
| 48 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
69 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
| 49 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
70 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
| 50 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
71 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
| 51 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
72 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
| 52 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
73 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
| 53 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
74 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
| 54 | } |
75 | } |
| 55 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEX) |
76 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEX) |
| 56 | { |
77 | { |
| 57 | #if sns_Serial_DEBUG==1 |
78 | #if sns_Serial_DEBUG==1 |
| 58 | printf("RS485HD\n"); |
79 | printf("RS485HD\n"); |
| 59 | #endif |
80 | #endif |
| Line 64... | Line 85... | ||
| 64 | /* TODO shoud the TX really be enabled in half duplex? */ |
85 | /* TODO shoud the TX really be enabled in half duplex? */ |
| 65 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
86 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
| 66 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
87 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
| 67 | } |
88 | } |
| 68 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEXWITHTERMINATION) |
89 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEXWITHTERMINATION) |
| 69 | { |
90 | { |
| 70 | #if sns_Serial_DEBUG==1 |
91 | #if sns_Serial_DEBUG==1 |
| 71 | printf("485HDT\n"); |
92 | printf("485HDT\n"); |
| 72 | #endif |
93 | #endif |
| 73 | gpio_set_pin(sns_Serial_485_CONNECT); // enable RS485_CONNECT |
94 | gpio_set_pin(sns_Serial_485_CONNECT); // enable RS485_CONNECT |
| 74 | gpio_set_pin(sns_Serial_TERM_EN); // enable termination |
95 | gpio_set_pin(sns_Serial_TERM_EN); // enable termination |
| Line 111... | Line 132... | ||
| 111 | baudRate = eeprom_read_dword(EEDATA32.baudRate); |
132 | baudRate = eeprom_read_dword(EEDATA32.baudRate); |
| 112 | #else |
133 | #else |
| 113 | #warning This version of AVR-libc does not have support for eeprom read dword |
134 | #warning This version of AVR-libc does not have support for eeprom read dword |
| 114 | #endif |
135 | #endif |
| 115 | format = eeprom_read_word(EEDATA16.format); |
136 | format = eeprom_read_word(EEDATA16.format); |
| - | 137 | databits = eeprom_read_byte(EEDATA.databits); |
|
| - | 138 | stopbits = eeprom_read_byte(EEDATA.stopbits); |
|
| - | 139 | parityMode = eeprom_read_byte(EEDATA.parityMode); |
|
| 116 | } |
140 | } |
| 117 | else { |
141 | else { |
| 118 | //The CRC of the EEPROM is not correct, store default values and update CRC |
142 | //The CRC of the EEPROM is not correct, store default values and update CRC |
| 119 | #if ((__AVR_LIBC_MAJOR__ == 1 && __AVR_LIBC_MINOR__ == 6 && __AVR_LIBC_REVISION__ >=2)||(__AVR_LIBC_MAJOR__ == 1 && __AVR_LIBC_MINOR__ > 6)||__AVR_LIBC_MAJOR__ > 1) |
143 | #if ((__AVR_LIBC_MAJOR__ == 1 && __AVR_LIBC_MINOR__ == 6 && __AVR_LIBC_REVISION__ >=2)||(__AVR_LIBC_MAJOR__ == 1 && __AVR_LIBC_MINOR__ > 6)||__AVR_LIBC_MAJOR__ > 1) |
| 120 | eeprom_write_dword_crc(EEDATA32.baudRate, 9600, WITHOUT_CRC); |
144 | eeprom_write_dword_crc(EEDATA32.baudRate, 9600, WITHOUT_CRC); |
| 121 | #else |
145 | #else |
| 122 | #warning This version of AVR-libc does not have support for eeprom write dword |
146 | #warning This version of AVR-libc does not have support for eeprom write dword |
| 123 | #endif |
147 | #endif |
| 124 | eeprom_write_word_crc(EEDATA16.format, CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK, WITHOUT_CRC); |
148 | eeprom_write_word_crc(EEDATA16.format, CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK, WITHOUT_CRC); |
| - | 149 | eeprom_write_byte_crc(EEDATA.databits, 8, WITHOUT_CRC); |
|
| - | 150 | eeprom_write_byte_crc(EEDATA.stopbits, 1, WITHOUT_CRC); |
|
| - | 151 | eeprom_write_byte_crc(EEDATA.parityMode, PARITY_NONE, WITHOUT_CRC); |
|
| 125 | EEDATA_UPDATE_CRC; |
152 | EEDATA_UPDATE_CRC; |
| 126 | } |
153 | } |
| 127 | #endif |
154 | #endif |
| - | 155 | uart_setDatabits(databits); |
|
| - | 156 | uart_setStopbits(stopbits); |
|
| - | 157 | uart_setParity(parityMode!=PARITY_NONE, parityMode==PARITY_ODD); |
|
| 128 | // default baudrate |
158 | // default baudrate |
| 129 | uart_init(UART_BAUD_SELECT(baudRate, F_CPU)); |
159 | uart_init(UART_BAUD_SELECT(baudRate, F_CPU)); |
| 130 | 160 | ||
| 131 | // configure control pins to outputs |
161 | // configure control pins to outputs |
| 132 | gpio_set_out(sns_Serial_RXEN); |
162 | gpio_set_out(sns_Serial_RXEN); |
| Line 135... | Line 165... | ||
| 135 | gpio_set_out(sns_Serial_485_232); |
165 | gpio_set_out(sns_Serial_485_232); |
| 136 | gpio_set_out(sns_Serial_TERM_EN); |
166 | gpio_set_out(sns_Serial_TERM_EN); |
| 137 | gpio_set_out(sns_Serial_485_CONNECT); |
167 | gpio_set_out(sns_Serial_485_CONNECT); |
| 138 | 168 | ||
| 139 | sns_Serial_setSettings(); |
169 | sns_Serial_setSettings(); |
| 140 | 170 | ||
| 141 | #if sns_Serial_DEBUG==1 |
171 | #if sns_Serial_DEBUG==1 |
| 142 | printf("Serial started!\n"); |
172 | printf("Serial started!\n"); |
| 143 | #endif |
173 | #endif |
| 144 | 174 | ||
| 145 | msg.Length = 0; // no data so far |
175 | msg.Length = 0; // no data so far |
| 146 | } |
176 | } |
| Line 209... | Line 239... | ||
| 209 | uart_putc(rxMsg->Data[i]); |
239 | uart_putc(rxMsg->Data[i]); |
| 210 | } |
240 | } |
| 211 | /* TODO Cannot disable TX yet, the data has only been placed in buffer but not sent */ |
241 | /* TODO Cannot disable TX yet, the data has only been placed in buffer but not sent */ |
| 212 | // gpio_clr_pin(sns_Serial_TXEN); // disable TX |
242 | // gpio_clr_pin(sns_Serial_TXEN); // disable TX |
| 213 | break; |
243 | break; |
| - | 244 | ||
| 214 | case CAN_MODULE_CMD_SERIAL_SERIALCONFIG: |
245 | case CAN_MODULE_CMD_SERIAL_SERIALCONFIG: |
| 215 | baudRate = 10 * (((uint32_t)rxMsg->Data[1] << 0) | ((uint32_t)rxMsg->Data[0] << 8)); |
246 | baudRate = 10 * (((uint32_t)rxMsg->Data[1] << 0) | ((uint32_t)rxMsg->Data[0] << 8)); |
| 216 | format = (uint16_t)rxMsg->Data[2]; |
247 | format = (uint16_t)rxMsg->Data[2]; |
| - | 248 | databits = lim(rxMsg->Data[3], 5, 9); |
|
| - | 249 | stopbits = lim(rxMsg->Data[4], 1, 2); |
|
| - | 250 | parityMode = lim(rxMsg->Data[5], 0, 2); |
|
| - | 251 | uart_setDatabits(databits); |
|
| - | 252 | uart_setStopbits(stopbits); |
|
| - | 253 | uart_setParity(parityMode!=PARITY_NONE, parityMode==PARITY_ODD); |
|
| 217 | uart_init(UART_BAUD_SELECT(baudRate, F_CPU)); |
254 | uart_init(UART_BAUD_SELECT(baudRate, F_CPU)); |
| 218 | 255 | ||
| 219 | uint8_t returnval = sns_Serial_setSettings(); |
256 | uint8_t returnval = sns_Serial_setSettings(); |
| 220 | 257 | ||
| 221 | if (returnval) |
258 | if (returnval) |
| Line 226... | Line 263... | ||
| 226 | eeprom_write_dword_crc(EEDATA32.baudRate, baudRate, WITHOUT_CRC); |
263 | eeprom_write_dword_crc(EEDATA32.baudRate, baudRate, WITHOUT_CRC); |
| 227 | #else |
264 | #else |
| 228 | #warning This version of AVR-libc does not have support for eeprom read dword |
265 | #warning This version of AVR-libc does not have support for eeprom read dword |
| 229 | #endif |
266 | #endif |
| 230 | eeprom_write_word_crc(EEDATA16.format, format, WITHOUT_CRC); |
267 | eeprom_write_word_crc(EEDATA16.format, format, WITHOUT_CRC); |
| - | 268 | eeprom_write_byte_crc(EEDATA.databits, databits, WITHOUT_CRC); |
|
| - | 269 | eeprom_write_byte_crc(EEDATA.stopbits, stopbits, WITHOUT_CRC); |
|
| - | 270 | eeprom_write_byte_crc(EEDATA.parityMode, parityMode, WITHOUT_CRC); |
|
| 231 | EEDATA_UPDATE_CRC; |
271 | EEDATA_UPDATE_CRC; |
| 232 | #endif |
272 | #endif |
| 233 | } |
273 | } |
| 234 | break; |
274 | break; |
| 235 | } |
275 | } |