下面是在STM32H743上操作的。但是在STM32F437上操作就没有问题,硬件完全一样。
void CAN_handler(CANNUM can)? {?? ? ?? ?#include "bsp_gpio.h" ?? ?uint8_t g_canintf;
?? ?g_canintf= ? ?CAN_SPI_CMD(can, SPI_CMD_READ,TOLONG(&(MCP2515_MAP->CANINTF)), ARG_UNUSED, ARG_UNUSED );?? ?? ?? ?? ?if(g_canintf&0x1c) ?//发送空 ?? ?{ ?? ??? ?Can_Frame can_fm; ?? ??? ?CAN_SPI_CMD(can, SPI_CMD_BITMOD, TOLONG(&(MCP2515_MAP->CANINTF)), 0x1c, ARG_UNUSED ); ?? ??? ?if(can_frame_load(can, &can_fm))?? ?//有数据 ?? ??? ??? ?CAN_send(can, &can_fm); ?? ??? ?else?? ?//发送完毕 ?? ??? ?{ ?? ??? ??? ?can_snd_group[can].can_snd_ok=1; ?? ??? ??? ?can_snd_group[can].can_snd_idx=0; ?? ??? ??? ?can_snd_group[can].can_snd_left=0; ?? ??? ??? ?can_snd_group[can].can_snd_id=0; ?? ??? ?} ? ? ? CAN_SPI_CMD(can, SPI_CMD_BITMOD, TOLONG(&(MCP2515_MAP->CANINTF)), 0x1c, ARG_UNUSED ); ?? ?}?? ??? ? }
遇到一个问题,mcp25625不能清除CAN发送中断,如果把清除中断函数CAN_SPI_CMD()放在前面位置就没有问题,但是把CAN_SPI_CMD()放在后面位置就发现清除中断失败,还有就是中间不操作外部RAM也没有问题,can_snd_group是定义在外部RAM空间的全局变量。如果把can_snd_group定义到内置RAM也没有问题,真是百思不得其解。
MARK下,以后找到原因了再来更新,先规避了。
|