Subversion Repositories HomeAutomation

Rev

Rev 1560 | Rev 1575 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1560 Rev 1561
Line 20... Line 20...
20
 
20
 
21
// prepare a new message, in case new data is available
21
// prepare a new message, in case new data is available
22
static StdCan_Msg_t msg;
22
static StdCan_Msg_t msg;
23
 
23
 
24
#define sns_Serial_DEBUG 0
24
#define sns_Serial_DEBUG 0
-
 
25
 
-
 
26
 
-
 
27
 
-
 
28
uint8_t sns_Serial_setSettings(void)
-
 
29
{
-
 
30
    uint8_t returnval = 1;
-
 
31
   
-
 
32
    if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS232)
-
 
33
    {
-
 
34
#if sns_Serial_DEBUG==1
-
 
35
        printf("RS232\n");
-
 
36
#endif
-
 
37
        gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
38
        gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
39
        gpio_clr_pin(sns_Serial_485_232);       // RS232 mode
-
 
40
        gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
41
        gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
42
    }
-
 
43
    else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485FULLDUPLEX)
-
 
44
    {
-
 
45
#if sns_Serial_DEBUG==1
-
 
46
        printf("RS485FD\n");
-
 
47
#endif
-
 
48
        gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
49
        gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
50
        gpio_set_pin(sns_Serial_485_232);       // RS485 mode
-
 
51
        gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
52
        gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
53
        gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
54
    }
-
 
55
    else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEX)
-
 
56
    {
-
 
57
#if sns_Serial_DEBUG==1
-
 
58
        printf("RS485HD\n");
-
 
59
#endif
-
 
60
        gpio_set_pin(sns_Serial_485_CONNECT);   // enable RS485_CONNECT
-
 
61
        gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
62
        gpio_set_pin(sns_Serial_485_232);       // RS485 mode
-
 
63
        gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
64
    /* TODO shoud the TX really be enabled in half duplex? */
-
 
65
        gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
66
        gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
67
    }
-
 
68
    else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEXWITHTERMINATION)
-
 
69
    {
-
 
70
#if sns_Serial_DEBUG==1
-
 
71
        printf("485HDT\n");
-
 
72
#endif
-
 
73
        gpio_set_pin(sns_Serial_485_CONNECT);   // enable RS485_CONNECT
-
 
74
        gpio_set_pin(sns_Serial_TERM_EN);       // enable termination
-
 
75
        gpio_set_pin(sns_Serial_485_232);       // RS485 mode
-
 
76
    /* TODO shoud the TX really be enabled in half duplex? */
-
 
77
        gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
78
        gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
79
        gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
80
    }
-
 
81
    else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK)
-
 
82
    {
-
 
83
#if sns_Serial_DEBUG==1
-
 
84
        printf("LPMODE\n");
-
 
85
#endif
-
 
86
        gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
87
        gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
88
        gpio_set_pin(sns_Serial_485_232);       // RS232 mode
-
 
89
        gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
90
        gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
91
        gpio_clr_pin(sns_Serial_ON);            // disable charge pump (i.e. enable loopback)
-
 
92
    }
-
 
93
    else
-
 
94
    {
-
 
95
        //invalid format
-
 
96
#if sns_Serial_DEBUG==1
-
 
97
        printf("ERROR!\n");
-
 
98
#endif
-
 
99
        //return 0, not successful
-
 
100
        returnval = 0;
-
 
101
    }
-
 
102
   
-
 
103
    return returnval;
-
 
104
}
25
 
105
 
26
void sns_Serial_Init(void)
106
void sns_Serial_Init(void)
27
{
107
{
28
#ifdef sns_Serial_USEEEPROM
108
#ifdef sns_Serial_USEEEPROM
29
    if (EEDATA_OK) {
109
    if (EEDATA_OK) {
30
#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)
110
#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)
31
        baudRate = eeprom_read_dword(EEDATA32.baudRate);
111
        baudRate = eeprom_read_dword(EEDATA32.baudRate);
32
#else
112
#else
33
#warning This version of AVR-libc does not have support for eeprom read dword
113
#warning This version of AVR-libc does not have support for eeprom read dword
34
#endif
114
#endif
35
        format = eeprom_read_word(EEDATA16.format);
115
        format = eeprom_read_word(EEDATA16.format);
-
 
116
//      printf("y\n");
36
    }
117
    }
37
    else {
118
    else {
38
        //The CRC of the EEPROM is not correct, store default values and update CRC
119
        //The CRC of the EEPROM is not correct, store default values and update CRC
39
#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
#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)
40
        eeprom_write_dword_crc(EEDATA32.baudRate, 9600, WITHOUT_CRC);
121
        eeprom_write_dword_crc(EEDATA32.baudRate, 9600, WITHOUT_CRC);
41
#else
122
#else
42
#warning This version of AVR-libc does not have support for eeprom write dword
123
#warning This version of AVR-libc does not have support for eeprom write dword
43
#endif
124
#endif
44
        eeprom_write_word_crc(EEDATA16.format, CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK, WITHOUT_CRC);
125
        eeprom_write_word_crc(EEDATA16.format, CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK, WITHOUT_CRC);
45
        EEDATA_UPDATE_CRC;
126
        EEDATA_UPDATE_CRC;
-
 
127
//      printf("z\n");
46
    }
128
    }
47
#endif
129
#endif
48
    // default baudrate
130
    // default baudrate
49
    uart_init(UART_BAUD_SELECT(baudRate, F_CPU));
131
    uart_init(UART_BAUD_SELECT(baudRate, F_CPU));
-
 
132
   
50
    // configure control pins
133
    // configure control pins to outputs
51
    gpio_set_out(sns_Serial_RXEN);
134
    gpio_set_out(sns_Serial_RXEN);
52
    gpio_set_out(sns_Serial_TXEN);
135
    gpio_set_out(sns_Serial_TXEN);
53
    gpio_set_out(sns_Serial_ON);
136
    gpio_set_out(sns_Serial_ON);
54
    gpio_set_out(sns_Serial_485_232);
137
    gpio_set_out(sns_Serial_485_232);
55
    gpio_set_out(sns_Serial_TERM_EN);
138
    gpio_set_out(sns_Serial_TERM_EN);
56
    gpio_set_out(sns_Serial_485_CONNECT);
139
    gpio_set_out(sns_Serial_485_CONNECT);
57
    //default to loopback mode until config command received
-
 
58
    gpio_clr_pin(sns_Serial_ON);
-
 
59
    gpio_clr_pin(sns_Serial_485_232);
-
 
60
    gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
61
    gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
62
    gpio_set_pin(sns_Serial_485_232);       // RS232 mode
-
 
63
    gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
64
    gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
65
 
140
 
66
    // to use PCINt lib, call this function: (the callback function look as a timer callback function)
-
 
67
    // Pcint_SetCallbackPin(sns_Serial_PCINT, EXP_C , &sns_Serial_pcint_callback);
141
    sns_Serial_setSettings();
68
 
142
 
69
#if sns_Serial_DEBUG==1
143
#if sns_Serial_DEBUG==1
70
    printf("Serial started!\n");
144
    printf("Serial started!\n");
71
#endif
145
#endif
72
 
146
 
73
    msg.Length = 0; // no data so far
147
    msg.Length = 0; // no data so far
74
}
148
}
75
 
-
 
76
//unsigned char sData[8];
-
 
77
//uint8_t dataCnt=0;
-
 
78
 
149
 
79
void sns_Serial_Process(void)
150
void sns_Serial_Process(void)
80
{
151
{
81
    StdCan_Set_class(msg.Header, CAN_MODULE_CLASS_SNS);
152
    StdCan_Set_class(msg.Header, CAN_MODULE_CLASS_SNS);
82
    StdCan_Set_direction(msg.Header, DIRECTIONFLAG_TO_OWNER);
153
    StdCan_Set_direction(msg.Header, DIRECTIONFLAG_TO_OWNER);
Line 102... Line 173...
102
            printf("RX\n");
173
            printf("RX\n");
103
#endif
174
#endif
104
            // insert it into the message
175
            // insert it into the message
105
            msg.Data[(uint8_t)msg.Length] = c;
176
            msg.Data[(uint8_t)msg.Length] = c;
106
            msg.Length++;
177
            msg.Length++;
107
           
178
           
108
#if sns_Serial_FORCE_SEND_TIME_MS > 0
179
#if sns_Serial_FORCE_SEND_TIME_MS > 0
109
            Timer_SetTimeout(sns_Serial_FORCE_SEND_TIMER, sns_Serial_FORCE_SEND_TIME_MS , TimerTypeOneShot, 0);
180
            Timer_SetTimeout(sns_Serial_FORCE_SEND_TIMER, sns_Serial_FORCE_SEND_TIME_MS , TimerTypeOneShot, 0);
110
#endif
181
#endif
111
        }
182
        }
112
    // keep going until max data length reached, or until uart RXBUF is empty
183
    // keep going until max data length reached, or until uart RXBUF is empty
113
    } while (status == 0 && msg.Length < 8);
184
    } while (status == 0 && msg.Length < 8);
114
   
185
   
115
    // check if force send or send-frame full
186
    // check if force send or send-frame full
116
    if (Timer_Expired(sns_Serial_FORCE_SEND_TIMER) || msg.Length == 8 || (sns_Serial_FORCE_SEND_TIME_MS == 0 && msg.Length>0))
187
    if ((Timer_Expired(sns_Serial_FORCE_SEND_TIMER) && msg.Length>0) || msg.Length == 8 || (sns_Serial_FORCE_SEND_TIME_MS == 0 && msg.Length>0))
117
    {
188
    {
118
        // transmit this chunk of data (max 8 chars)
189
        // transmit this chunk of data (max 8 chars)
119
        while(StdCan_Put(&msg) != StdCan_Ret_OK);
190
        while(StdCan_Put(&msg) != StdCan_Ret_OK);
120
        msg.Length = 0; // no data so far
191
        msg.Length = 0; // no data so far
121
    }
192
    }
122
}
193
}
Line 127... Line 198...
127
        StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_FROM_OWNER &&
198
        StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_FROM_OWNER &&
128
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_SERIAL &&
199
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_SERIAL &&
129
        rxMsg->Header.ModuleId == sns_Serial_ID)
200
        rxMsg->Header.ModuleId == sns_Serial_ID)
130
    {
201
    {
131
        switch (rxMsg->Header.Command)
202
        switch (rxMsg->Header.Command)
132
        {
203
        {
133
            case CAN_MODULE_CMD_SERIAL_SERIALDATA:
204
            case CAN_MODULE_CMD_SERIAL_SERIALDATA:
134
#if sns_Serial_DEBUG==1
205
#if sns_Serial_DEBUG==1
135
                printf("TX\n");
206
                printf("TX\n");
136
#endif
207
#endif
137
                gpio_set_pin(sns_Serial_TXEN);          // enable TX
208
                gpio_set_pin(sns_Serial_TXEN);          // enable TX
138
                for (uint8_t i=0; i<rxMsg->Length; i++)
209
                for (uint8_t i=0; i<rxMsg->Length; i++)
139
                {
210
                {
140
                    uart_putc(rxMsg->Data[i]);
211
                    uart_putc(rxMsg->Data[i]);
141
                }
212
                }
Line 144... Line 215...
144
                break;
215
                break;
145
            case CAN_MODULE_CMD_SERIAL_SERIALCONFIG:
216
            case CAN_MODULE_CMD_SERIAL_SERIALCONFIG:
146
                baudRate = 10 * (((uint32_t)rxMsg->Data[1] << 0) | ((uint32_t)rxMsg->Data[0] << 8));
217
                baudRate = 10 * (((uint32_t)rxMsg->Data[1] << 0) | ((uint32_t)rxMsg->Data[0] << 8));
147
                format = (uint16_t)rxMsg->Data[2];
218
                format = (uint16_t)rxMsg->Data[2];
148
                uart_init(UART_BAUD_SELECT(baudRate, F_CPU));
219
                uart_init(UART_BAUD_SELECT(baudRate, F_CPU));
149
                if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS232)
-
 
150
                {
220
               
151
#if sns_Serial_DEBUG==1
-
 
152
                    printf("RS232\n");
-
 
153
#endif
-
 
154
                    gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
155
                    gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
156
                    gpio_clr_pin(sns_Serial_485_232);       // RS232 mode
-
 
157
                    gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
158
                    gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
159
                }
-
 
160
                else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485FULLDUPLEX)
-
 
161
                {
-
 
162
#if sns_Serial_DEBUG==1
-
 
163
                    printf("RS485FD\n");
-
 
164
#endif
-
 
165
                    gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
166
                    gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
167
                    gpio_set_pin(sns_Serial_485_232);       // RS485 mode
-
 
168
                    gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
169
                    gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
170
                    gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
171
                }
-
 
172
                else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEX)
-
 
173
                {
-
 
174
#if sns_Serial_DEBUG==1
-
 
175
                    printf("RS485HD\n");
-
 
176
#endif
-
 
177
                    gpio_set_pin(sns_Serial_485_CONNECT);   // enable RS485_CONNECT
-
 
178
                    gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
179
                    gpio_set_pin(sns_Serial_485_232);       // RS485 mode
-
 
180
                    gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
181
                /* TODO shoud the TX really be enabled in half duplex? */
-
 
182
                    gpio_set_pin(sns_Serial_TXEN);          // enable TX
221
                uint8_t returnval = sns_Serial_setSettings();
183
                    gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
184
                }
-
 
185
                else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_RS485HALFDUPLEXWITHTERMINATION)
-
 
186
                {
222
               
187
#if sns_Serial_DEBUG==1
-
 
188
                    printf("485HDT\n");
223
                if (returnval)
189
#endif
-
 
190
                    gpio_set_pin(sns_Serial_485_CONNECT);   // enable RS485_CONNECT
-
 
191
                    gpio_set_pin(sns_Serial_TERM_EN);       // enable termination
-
 
192
                    gpio_set_pin(sns_Serial_485_232);       // RS485 mode
-
 
193
                /* TODO shoud the TX really be enabled in half duplex? */
-
 
194
                    gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
195
                    gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
196
                    gpio_set_pin(sns_Serial_ON);            // enable charge pump
-
 
197
                }
-
 
198
                else if (format == CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK)
-
 
199
                {
224
                {
200
#if sns_Serial_DEBUG==1
-
 
201
                    printf("LPMODE\n");
-
 
202
#endif
-
 
203
                    gpio_clr_pin(sns_Serial_485_CONNECT);   // disable RS485_CONNECT
-
 
204
                    gpio_clr_pin(sns_Serial_TERM_EN);       // disable termination
-
 
205
                    gpio_set_pin(sns_Serial_485_232);       // RS232 mode
-
 
206
                    gpio_set_pin(sns_Serial_RXEN);          // enable RX
-
 
207
                    gpio_set_pin(sns_Serial_TXEN);          // enable TX
-
 
208
                    gpio_clr_pin(sns_Serial_ON);            // disable charge pump (i.e. enable loopback)
-
 
209
                }
-
 
210
                else
-
 
211
                {
-
 
212
                    //invalid format
-
 
213
#if sns_Serial_DEBUG==1
-
 
214
                    printf("ERROR!\n");
-
 
215
#endif
-
 
216
                    //break prematurely, to prevent data from being saved in EEPROM
-
 
217
                    break;
-
 
218
                }
-
 
219
               
-
 
220
                // update EEPROM data
225
                // update EEPROM data
221
#ifdef sns_Serial_USEEEPROM
226
#ifdef sns_Serial_USEEEPROM
222
#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)
227
#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)
223
                eeprom_write_dword_crc(EEDATA32.baudRate, 9600, WITHOUT_CRC);
228
                eeprom_write_dword_crc(EEDATA32.baudRate, baudRate, WITHOUT_CRC);
224
#else
229
#else
225
#warning This version of AVR-libc does not have support for eeprom read dword
230
#warning This version of AVR-libc does not have support for eeprom read dword
226
#endif
231
#endif
227
                eeprom_write_word_crc(EEDATA16.format, CAN_MODULE_ENUM_SERIAL_SERIALCONFIG_PHYSICALFORMAT_LOOPBACK, WITHOUT_CRC);
232
                eeprom_write_word_crc(EEDATA16.format, format, WITHOUT_CRC);
228
                EEDATA_UPDATE_CRC;
233
                EEDATA_UPDATE_CRC;
-
 
234
               
-
 
235
                printf("x\n");
229
#endif
236
#endif
230
               
237
                }
231
                break;
238
                break;
232
        }
239
        }
233
    }
240
    }
234
}
241
}
235
 
242