RxFIFO.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "RxFIFO.h"
  2. can_message_t canRxBuffer[CAN_RXBUFFER_SIZE];
  3. RxFIFOCtrl_t RxFIFOCtrl = {
  4. .BufferSize = CAN_RXBUFFER_SIZE,
  5. .pBuffer = canRxBuffer
  6. };
  7. void CAN_RxInterrupt(void)
  8. {
  9. can_message_t can_message_rx;
  10. // can_message_rx.id = ;
  11. // can_message_rx.dlc = l
  12. // can_message_rx.data = ;
  13. pushRxFIFO(can_message_rx);
  14. }
  15. /**
  16. * @brief Add a message to the FIFO to the data buffer
  17. * @param can_message_t message
  18. * @retval None
  19. * @note None
  20. */
  21. void pushRxFIFO(can_message_t can_message)
  22. {
  23. NVIC_INTERRPUT_DISABLE;
  24. memcpy(&RxFIFOCtrl.pBuffer[RxFIFOCtrl.WriteIndex], &can_message, sizeof(can_message_t));
  25. RxFIFOCtrl.WriteIndex += 1;
  26. RxFIFOCtrl.WriteIndex = RxFIFOCtrl.WriteIndex & (RxFIFOCtrl.BufferSize - 1);
  27. if(RxFIFOCtrl.WriteIndex == RxFIFOCtrl.ReadIndex){
  28. RxFIFOCtrl.ReadIndex += 1;
  29. RxFIFOCtrl.ReadIndex = RxFIFOCtrl.ReadIndex & (RxFIFOCtrl.BufferSize - 1);
  30. }else{
  31. RxFIFOCtrl.GotMsgNum++;
  32. }
  33. NVIC_INTERRPUT_ENABLE;
  34. }
  35. /**
  36. * @brief Read a message from the FIFO to the data buffer
  37. * @param can_message_t** Message pointer
  38. * @param msglen Gets the number of message frames
  39. * @retval The number of actually obtained CAN message frames
  40. * @note None
  41. */
  42. int32_t popRxFIFO(can_message_t **can_message, uint8_t msglen)
  43. {
  44. NVIC_INTERRPUT_DISABLE;
  45. int32_t msg_num = ((RxFIFOCtrl.WriteIndex >= RxFIFOCtrl.ReadIndex) ? RxFIFOCtrl.GotMsgNum : (RxFIFOCtrl.BufferSize - RxFIFOCtrl.ReadIndex));
  46. *can_message = &RxFIFOCtrl.pBuffer[RxFIFOCtrl.ReadIndex];
  47. msg_num = (msg_num < msglen) ? msg_num : msglen;
  48. RxFIFOCtrl.GotMsgNum -= msg_num;
  49. RxFIFOCtrl.ReadIndex = (RxFIFOCtrl.ReadIndex+msg_num) & (RxFIFOCtrl.BufferSize - 1);
  50. NVIC_INTERRPUT_ENABLE;
  51. return msg_num;
  52. }
  53. /* use example
  54. while(1) {
  55. can_message_t *can_message;
  56. if(popRxFIFO(&can_message, 1)) {
  57. // user handle begin
  58. // can_send(can_message);
  59. // user handle begin
  60. }
  61. }
  62. */