| 
 解决LPC54608can使用中断处理接收数据时漏包问题 接上一篇说吧,今天还是针对can这块做个简单的分享。 
 
 
1、要先明确什么会导致漏包? 
can发送到速度过快。中断接收到数据,但是数据被覆盖,应用层处理不过来。 
 
 
1个can包16Byte(8Byte数据,8Byte其他参数) 
假设can 速率250kbps。则1s中大能最传输多少包? 
250000bps / (16*8) = 1953个包。 
 
 
2、解决方法: 
使用ringbuff增加缓存数据区,增加一段buffer保存数据。 
- mcan_rx_buffer_frame_t rxFrame[64];
 
 - volatile uint16_t rdIndex=0; /* Index of the data to send out. */
 
 - volatile uint16_t wrIndex=0; /* Index of the memory to save new arrived data. */
 
 - void CAN0_IRQ0_IRQHandler(void)
 
 - {
 
 -     MCAN_ClearStatusFlag(EXAMPLE_MCAN, CAN_IR_RF0N_MASK);
 
 -         
 
 -     MCAN_ReadRxFifo(EXAMPLE_MCAN, 0, &rxFrame[wrIndex]);
 
 -           wrIndex = ((++wrIndex) & (64-1));
 
 -           if (wrIndex == rdIndex) {
 
 -                         rdIndex = ((++rdIndex) & (64-1));
 
 -                 }
 
 -     /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
 
 -       exception return operation might vector to incorrect interrupt */
 
 - #if defined __CORTEX_M && (__CORTEX_M == 4U)
 
 -     __DSB();
 
 - #endif
 
 - }
 
 -         read_data()
 
 -     {
 
 -                 ... ...
 
 -                 while (rdIndex == wrIndex) {
 
 -                 }
 
 -                 memcpy(rx_buf, rxFrame[rdIndex].data, rxFrame[rdIndex].size);
 
 -                 can_id = rxFrame[rdIndex].id;
 
 -                 //rdIndex = ((rdIndex++) & (64-1));
 
 -  
 
 -                 rdIndex = ((++rdIndex) & (64-1));
 
 -                 return (can_id/* >> STDID_OFFSET*/);
 
 -     }
 
 
  复制代码 
 
        
        
        
         |