Subversion Repositories HomeAutomation

Rev

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
        }