3838//------------------------------------------------------------------------------
3939
4040static CAN_HandleTypeDef hcan ;
41- static can_msg_t buffer [CAN_BUF_SIZE ];
42- static size_t buf_write_pos ;
43- static size_t buf_read_pos ;
41+ static volatile can_msg_t buffer [CAN_BUF_SIZE ];
42+ static volatile size_t buf_write_pos ;
43+ static volatile size_t buf_read_pos ;
4444
4545
4646//------------------------------------------------------------------------------
@@ -136,29 +136,32 @@ void can_send(uint8_t id, can_cmd_t cmd, uint8_t *payload, uint8_t len)
136136// Receive a CAN message
137137bool can_receive (can_msg_t * msg )
138138{
139- if (buf_read_pos != buf_write_pos )
139+ HAL_NVIC_DisableIRQ (USB_LP_CAN_RX0_IRQn );
140+
141+ if (buf_read_pos == buf_write_pos )
140142 {
141- // copy message from buffer
142- msg -> cmd = buffer [buf_read_pos ].cmd ;
143- msg -> id = buffer [buf_read_pos ].id ;
144- memcpy (msg -> payload , buffer [buf_read_pos ].payload , msg -> len );
145- msg -> len = buffer [buf_read_pos ].len ;
146-
147- // increment read position
148- if (buf_read_pos == (CAN_BUF_SIZE - 1 ))
149- buf_read_pos = 0 ;
150- else
151- buf_read_pos ++ ;
143+ HAL_NVIC_EnableIRQ (USB_LP_CAN_RX0_IRQn );
144+ return false;
145+ }
152146
153- // blink status LED on activity
154- HAL_GPIO_WritePin (STATUS_PORT , STATUS_PIN , GPIO_PIN_RESET );
155- HAL_Delay (STATUS_BLINK_TIME );
156- HAL_GPIO_WritePin (STATUS_PORT , STATUS_PIN , GPIO_PIN_SET );
147+ // copy message from buffer
148+ msg -> cmd = buffer [buf_read_pos ].cmd ;
149+ msg -> id = buffer [buf_read_pos ].id ;
150+ for (size_t i = 0 ; i < buffer [buf_read_pos ].len ; i ++ ) msg -> payload [i ] = buffer [buf_read_pos ].payload [i ];
151+ msg -> len = buffer [buf_read_pos ].len ;
157152
158- return true;
159- }
153+ // increment read position
154+ buf_read_pos ++ ;
155+ if (buf_read_pos >= CAN_BUF_SIZE ) buf_read_pos = 0 ;
156+
157+ HAL_NVIC_EnableIRQ (USB_LP_CAN_RX0_IRQn );
160158
161- return false;
159+ // blink status LED on activity
160+ HAL_GPIO_WritePin (STATUS_PORT , STATUS_PIN , GPIO_PIN_RESET );
161+ HAL_Delay (STATUS_BLINK_TIME );
162+ HAL_GPIO_WritePin (STATUS_PORT , STATUS_PIN , GPIO_PIN_SET );
163+
164+ return true;
162165}
163166
164167
@@ -169,27 +172,27 @@ bool can_receive(can_msg_t *msg)
169172// CAN FIFO0 receive ISR
170173void USB_LP_CAN_RX0_IRQHandler (void )
171174{
175+ CAN_RxHeaderTypeDef msg_header ;
176+ uint8_t msg_payload [8 ];
177+
172178 if (HAL_CAN_GetRxFifoFillLevel (& hcan , CAN_RX_FIFO0 ) > 0 )
173179 {
174- CAN_RxHeaderTypeDef msg_header ;
175- if (HAL_CAN_GetRxMessage (& hcan , CAN_RX_FIFO0 , & msg_header , buffer [buf_write_pos ].payload ) == HAL_OK )
180+ if (HAL_CAN_GetRxMessage (& hcan , CAN_RX_FIFO0 , & msg_header , msg_payload ) == HAL_OK )
176181 {
177182 buffer [buf_write_pos ].cmd = msg_header .ExtId >> 8 ;
178183 buffer [buf_write_pos ].id = msg_header .ExtId & 0xFF ;
184+ for (size_t i = 0 ; i < msg_header .DLC ; i ++ ) buffer [buf_write_pos ].payload [i ] = msg_payload [i ];
179185 buffer [buf_write_pos ].len = msg_header .DLC ;
180186
181187 // increment write position
182- if (buf_write_pos == (CAN_BUF_SIZE - 1 ))
183- buf_write_pos = 0 ;
184- else
185- buf_write_pos ++ ;
188+ buf_write_pos ++ ;
189+ if (buf_write_pos >= CAN_BUF_SIZE ) buf_write_pos = 0 ;
186190
191+ // bump read position if buffer is full
187192 if (buf_read_pos == buf_write_pos )
188193 {
189- if (buf_read_pos == (CAN_BUF_SIZE - 1 ))
190- buf_read_pos = 0 ;
191- else
192- buf_read_pos ++ ;
194+ buf_read_pos ++ ;
195+ if (buf_read_pos >= CAN_BUF_SIZE ) buf_read_pos = 0 ;
193196 }
194197 }
195198 else
0 commit comments