Rev 1459 | Rev 1536 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1459 | Rev 1475 | ||
|---|---|---|---|
| Line 11... | Line 11... | ||
| 11 | 0x1234 // y |
11 | 0x1234 // y |
| 12 | }, |
12 | }, |
| 13 | 0 // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts |
13 | 0 // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts |
| 14 | }; |
14 | }; |
| 15 | #endif |
15 | #endif |
| 16 | - | ||
| 17 | // types |
- | |
| 18 | typedef enum |
- | |
| 19 | { |
- | |
| 20 | SNS_SERIAL_PHYFORMAT_RS232 = 0, |
- | |
| 21 | SNS_SERIAL_PHYFORMAT_RS485 = 1, |
- | |
| 22 | SNS_SERIAL_PHYFORMAT_LOOPBACK = 2 |
- | |
| 23 | } snsSerialPhyFormat_t; |
- | |
| 24 | 16 | ||
| 25 | // internal variables |
17 | // internal variables |
| 26 | static |
18 | static uint32_t baudRate = 9600; |
| 27 | static |
19 | static uint16_t format = CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK; |
| 28 | 20 | ||
| 29 | void sns_Serial_Init(void) |
21 | void sns_Serial_Init(void) |
| 30 | { |
22 | { |
| 31 | #ifdef sns_Serial_USEEEPROM |
23 | #ifdef sns_Serial_USEEEPROM |
| 32 | if (EEDATA_OK) |
24 | if (EEDATA_OK) |
| Line 53... | Line 45... | ||
| 53 | //default to loopback mode until config command received |
45 | //default to loopback mode until config command received |
| 54 | gpio_clr_pin(sns_Serial_ON); |
46 | gpio_clr_pin(sns_Serial_ON); |
| 55 | gpio_clr_pin(sns_Serial_485_232); |
47 | gpio_clr_pin(sns_Serial_485_232); |
| 56 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
48 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
| 57 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
49 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
| - | 50 | gpio_set_pin(sns_Serial_485_232); // RS232 mode |
|
| - | 51 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
|
| - | 52 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
|
| 58 | 53 | ||
| 59 | // to use PCINt lib, call this function: (the callback function look as a timer callback function) |
54 | // to use PCINt lib, call this function: (the callback function look as a timer callback function) |
| 60 | // Pcint_SetCallbackPin(sns_Serial_PCINT, EXP_C , &sns_Serial_pcint_callback); |
55 | // Pcint_SetCallbackPin(sns_Serial_PCINT, EXP_C , &sns_Serial_pcint_callback); |
| 61 | 56 | ||
| - | 57 | printf("Serial started!\n"); |
|
| 62 | } |
58 | } |
| 63 | 59 | ||
| 64 | void sns_Serial_Process(void) |
60 | void sns_Serial_Process(void) |
| 65 | { |
61 | { |
| 66 | // prepare a new message, in case new data is available |
62 | // prepare a new message, in case new data is available |
| Line 84... | Line 80... | ||
| 84 | status = (unsigned char)((data & 0xFF00) >> 8); |
80 | status = (unsigned char)((data & 0xFF00) >> 8); |
| 85 | 81 | ||
| 86 | // status == 0 means we just received a new char |
82 | // status == 0 means we just received a new char |
| 87 | if (status == 0) |
83 | if (status == 0) |
| 88 | { |
84 | { |
| - | 85 | printf("RX\n"); |
|
| 89 | // insert it into the message |
86 | // insert it into the message |
| 90 | msg.Data[(uint8_t)msg.Length] = c; |
87 | msg.Data[(uint8_t)msg.Length] = c; |
| 91 | msg.Length++; |
88 | msg.Length++; |
| 92 | } |
89 | } |
| 93 | // keep going until max data length reached, or until uart RXBUF is empty |
90 | // keep going until max data length reached, or until uart RXBUF is empty |
| Line 105... | Line 102... | ||
| 105 | { |
102 | { |
| 106 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
103 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
| 107 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_FROM_OWNER && |
104 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_FROM_OWNER && |
| 108 | rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_SERIAL && |
105 | rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_SERIAL && |
| 109 | rxMsg->Header.ModuleId == sns_Serial_ID) |
106 | rxMsg->Header.ModuleId == sns_Serial_ID) |
| 110 | { |
107 | { |
| 111 | switch (rxMsg->Header.Command) |
108 | switch (rxMsg->Header.Command) |
| 112 | { |
109 | { |
| 113 | case CAN_MODULE_CMD_SERIAL_SERIALDATA: |
110 | case CAN_MODULE_CMD_SERIAL_SERIALDATA: |
| - | 111 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
|
| 114 | for (uint8_t i=0; i<rxMsg->Length; i++) |
112 | for (uint8_t i=0; i<rxMsg->Length; i++) |
| 115 | { |
113 | { |
| 116 | uart_putc(rxMsg->Data[i]); |
114 | uart_putc(rxMsg->Data[i]); |
| 117 | } |
115 | } |
| - | 116 | gpio_clr_pin(sns_Serial_TXEN); // disable TX |
|
| 118 | break; |
117 | break; |
| 119 | case CAN_MODULE_CMD_SERIAL_SERIALCONFIG: |
118 | case CAN_MODULE_CMD_SERIAL_SERIALCONFIG: |
| 120 | baudRate = |
119 | baudRate = 10 * (((uint32_t)rxMsg->Data[1] << 0) | ((uint32_t)rxMsg->Data[0] << 8)); |
| 121 | format = ( |
120 | format = (uint16_t)rxMsg->Data[2]; |
| 122 | uart_init(UART_BAUD_SELECT(baudRate, F_CPU)); |
121 | uart_init(UART_BAUD_SELECT(baudRate, F_CPU)); |
| 123 | if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS232) |
122 | if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS232) |
| 124 | { |
123 | { |
| - | 124 | printf("RS232\n"); |
|
| 125 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
125 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
| 126 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
126 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
| 127 | gpio_clr_pin(sns_Serial_485_232); // RS232 mode |
127 | gpio_clr_pin(sns_Serial_485_232); // RS232 mode |
| 128 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
128 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
| 129 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
- | |
| 130 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
129 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
| 131 | } |
130 | } |
| 132 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485FULLDUPLEX) |
131 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485FULLDUPLEX) |
| 133 | { |
132 | { |
| - | 133 | printf("RS485FD\n"); |
|
| 134 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
134 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
| 135 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
135 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
| - | 136 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
|
| - | 137 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
|
| - | 138 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
|
| - | 139 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
|
| - | 140 | } |
|
| - | 141 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEX) |
|
| - | 142 | { |
|
| - | 143 | printf("RS485HD\n"); |
|
| - | 144 | gpio_set_pin(sns_Serial_485_CONNECT); // enable RS485_CONNECT |
|
| - | 145 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
|
| 136 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
146 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
| 137 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
147 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
| 138 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
148 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
| 139 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
- | |
| 140 | } |
- | |
| 141 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEX) |
- | |
| 142 | { |
- | |
| 143 | gpio_set_pin(sns_Serial_485_CONNECT); // enable RS485_CONNECT |
- | |
| 144 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
- | |
| 145 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
- | |
| 146 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
- | |
| 147 | gpio_clr_pin(sns_Serial_TXEN); // disable TX |
- | |
| 148 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
149 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
| 149 | } |
150 | } |
| 150 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEXWITHTERMINATION) |
151 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEXWITHTERMINATION) |
| 151 | { |
152 | { |
| - | 153 | printf("485HDT\n"); |
|
| 152 | gpio_set_pin(sns_Serial_485_CONNECT); // enable RS485_CONNECT |
154 | gpio_set_pin(sns_Serial_485_CONNECT); // enable RS485_CONNECT |
| 153 | gpio_set_pin(sns_Serial_TERM_EN); // enable termination |
155 | gpio_set_pin(sns_Serial_TERM_EN); // enable termination |
| 154 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
156 | gpio_set_pin(sns_Serial_485_232); // RS485 mode |
| 155 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
157 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
| 156 |
|
158 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
| 157 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
159 | gpio_set_pin(sns_Serial_ON); // enable charge pump |
| 158 | } |
160 | } |
| 159 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK) |
161 | else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK) |
| 160 | { |
162 | { |
| - | 163 | printf("LPMODE\n"); |
|
| 161 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
164 | gpio_clr_pin(sns_Serial_485_CONNECT); // disable RS485_CONNECT |
| 162 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
165 | gpio_clr_pin(sns_Serial_TERM_EN); // disable termination |
| 163 | gpio_set_pin(sns_Serial_485_232); // RS232 mode |
166 | gpio_set_pin(sns_Serial_485_232); // RS232 mode |
| 164 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
167 | gpio_set_pin(sns_Serial_RXEN); // enable RX |
| 165 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
168 | gpio_set_pin(sns_Serial_TXEN); // enable TX |
| 166 | gpio_clr_pin(sns_Serial_ON); // disable charge pump (i.e. enable loopback) |
169 | gpio_clr_pin(sns_Serial_ON); // disable charge pump (i.e. enable loopback) |
| 167 | } |
170 | } |
| 168 | else |
171 | else |
| 169 | { |
172 | { |
| 170 | //invalid format |
173 | //invalid format |
| - | 174 | printf("ERROR!\n"); |
|
| 171 | } |
175 | } |
| 172 | break; |
176 | break; |
| 173 | } |
177 | } |
| 174 | } |
178 | } |
| 175 | } |
179 | } |
| 176 | 180 | ||
| 177 | void sns_Serial_List(uint8_t ModuleSequenceNumber) |
181 | void sns_Serial_List(uint8_t ModuleSequenceNumber) |
| 178 | { |
182 | { |
| 179 | StdCan_Msg_t txMsg; |
183 | StdCan_Msg_t txMsg; |
| 180 | 184 | ||
| 181 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); |
185 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); |
| 182 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); |
186 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); |
| 183 | txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_SERIAL; |
187 | txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_SERIAL; |
| 184 | txMsg.Header.ModuleId = sns_Serial_ID; |
188 | txMsg.Header.ModuleId = sns_Serial_ID; |
| 185 | txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST; |
189 | txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST; |
| 186 | txMsg.Length = 6; |
190 | txMsg.Length = 6; |
| 187 | 191 | ||
| 188 | txMsg.Data[0] = NODE_HW_ID_BYTE0; |
192 | txMsg.Data[0] = NODE_HW_ID_BYTE0; |
| 189 | txMsg.Data[1] = NODE_HW_ID_BYTE1; |
193 | txMsg.Data[1] = NODE_HW_ID_BYTE1; |
| 190 | txMsg.Data[2] = NODE_HW_ID_BYTE2; |
194 | txMsg.Data[2] = NODE_HW_ID_BYTE2; |
| 191 | txMsg.Data[3] = NODE_HW_ID_BYTE3; |
195 | txMsg.Data[3] = NODE_HW_ID_BYTE3; |
| 192 | 196 | ||
| 193 | txMsg.Data[4] = NUMBER_OF_MODULES; |
197 | txMsg.Data[4] = NUMBER_OF_MODULES; |
| 194 | txMsg.Data[5] = ModuleSequenceNumber; |
198 | txMsg.Data[5] = ModuleSequenceNumber; |
| 195 | 199 | ||
| 196 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
200 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
| 197 | } |
201 | } |
| - | 202 | ||