中级会员
 
- 积分
- 295
- 金钱
- 295
- 注册时间
- 2020-11-4
- 在线时间
- 121 小时
|
2金钱
我用的是STM32F407的最小系统板,用的是PA11和PA12 CAN1_RX和CAN1_TX,外接了某宝的TJA1050CAN模块CAN1初始化如下:
uint8_t CAN1_mode_init(uint8_t tsjw, uint8_t tbs2, uint8_t tbs1, uint16_t brp, uint8_t mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = ENABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = mode;
CAN_InitStructure.CAN_SJW = tsjw;
CAN_InitStructure.CAN_BS1 = tbs1;
CAN_InitStructure.CAN_BS2 = tbs2;
CAN_InitStructure.CAN_Prescaler = brp;
CAN_Init(CAN1, &CAN_InitStructure);
CAN_FilterInitStructure.CAN_FilterNumber = 3;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);//FIFO0消息挂号中断允许,每接收一次进一次中断
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
return 0;
}
CAN发送如下:
void CAN_CMD_CHASSIS(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
{
CanTxMsg TxMessage;
TxMessage.StdId = 0x200;
TxMessage.IDE = CAN_ID_STD;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.DLC = 0x08;
TxMessage.Data[0] = motor1 >> 8;
TxMessage.Data[1] = motor1;
TxMessage.Data[2] = motor2 >> 8;
TxMessage.Data[3] = motor2;
TxMessage.Data[4] = motor3 >> 8;
TxMessage.Data[5] = motor3;
TxMessage.Data[6] = motor4 >> 8;
TxMessage.Data[7] = motor4;
CAN_Transmit(CHASSIS_CAN, &TxMessage);
}
通过DEBUG看到的CAN_Transmit(CHASSIS_CAN, &TxMessage)返回的是 transmit_mailbox = CAN_TxStatus_NoMailBox;
请问应该如何解决,TJA硬件电路是正常能用的已在阿波罗板子测试过。一到407最小系统板子上就出现了这个错误
|
最佳答案
查看完整内容[请看2#楼]
是邮箱问题的话建议如下处理,避免用delay:
TransmitMailbox=CAN_Transmit(CAN1,&CanTxMessage);
i = 0;
while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (i < 0xFF))
{
i++;
}
|