初级会员

- 积分
- 104
- 金钱
- 104
- 注册时间
- 2019-11-7
- 在线时间
- 18 小时
|
10金钱
电路图:
实物图:
已经将后续所有的调理电路上的元器件取下
STM32配置图:
程序:
CAN过滤器初始化:
/**
* @brief CAN_Init for mask configuration
* @param hcan handle
* @return none
**/
void CAN_User_Init(CAN_HandleTypeDef* hcan )
{
CAN_FilterTypeDef sFilterConfig;
HAL_StatusTypeDef HAL_Status;
// For EXID, you can configure it.
TxMeg.IDE=CAN_ID_STD;
TxMeg.RTR=CAN_RTR_DATA;
sFilterConfig.FilterBank = 0; // Filter 0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // Mask mode
sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;
sFilterConfig.FilterIdHigh = 0;
sFilterConfig.FilterIdLow = 0;
sFilterConfig.FilterMaskIdHigh = 0;
sFilterConfig.FilterMaskIdLow = 0;
sFilterConfig.FilterFIFOAssignment = CAN1FIFO;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 0;
HAL_Status=HAL_CAN_ConfigFilter(hcan, &sFilterConfig);
HAL_Status=HAL_CAN_Start(hcan);
if(HAL_Status!=HAL_OK)
{
printf("Start CAN fail!\r\n");
}
HAL_Status=HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
if(HAL_Status!=HAL_OK)
{
printf("Start interrupt fail!\r\n");
}
else
{
if(hcan == &hcan1)
printf("CAN1 start successful!\r\n");
else
printf("CAN2 start successful!\r\n");
}
}
CAN接收中断函数
/**
* @brief interrupt function for can receive
**/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) //接收回调函数
{
uint8_t Data[8];
uint8_t i =0;
HAL_StatusTypeDef HAL_RetVal;
HAL_RetVal = HAL_CAN_GetRxMessage(hcan, CAN1FIFO, &RxMeg, Data);
if ( HAL_OK == HAL_RetVal)
{
if(hcan == &hcan1)
printf("CAN-BUS-01 Receive, id: %#x\n", RxMeg.StdId);
else
printf("CAN-BUS-02 Receive, id: %#x\n", RxMeg.StdId);
printf(" data:");
for(i = 0; i<RxMeg.DLC; i++)
{
printf(" %#x", Data);
}
printf("\r\n");
}
}
CAN发送函数:
/**
* @brief CAN Send data
* @param hcan handle
* @param ID identifiler
* @param pData data
* @param Len length of data
* @return HAL_OK and HAL_ERROR
**/
HAL_StatusTypeDef CANx_SendNormalData(CAN_HandleTypeDef* hcan, uint16_t ID,
uint8_t *pData, uint16_t Len, uint8_t timeout)
{
HAL_StatusTypeDef HAL_RetVal;
uint16_t SendTimes, SendCNT=0;
uint8_t FreeTxNum=0, timecnt = 0;
TxMeg.StdId=ID;
// make sure the input param is right.
if(!hcan || ! pData ||!Len) return HAL_ERROR;
SendTimes=Len/8+(Len%8?1:0);
FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan);
TxMeg.DLC=8;
while(SendTimes--)
{
if(0==SendTimes)
{
if(Len%8)
TxMeg.DLC=Len%8;
}
while(0==FreeTxNum)
{
FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan);
timecnt++;
if(timecnt >= timeout)
return HAL_ERROR;
}
HAL_RetVal=HAL_CAN_AddTxMessage(hcan,&TxMeg,pData+SendCNT,
(uint32_t*)CAN_TX_MAILBOX0);
if(HAL_RetVal!=HAL_OK)
{
printf("CAN Send error\r\n");
return HAL_ERROR;
}
SendCNT+=8;
}
return HAL_OK;
}
测试循环代码:
printf("\r\nThis is board 01\r\n");
CANx_SendNormalData(&hcan1, 0x101, data1, 3, 100);
CANx_SendNormalData(&hcan2, 0x102, data2, 3, 100);
测试结果:
回环模式测试正常
正常模式无数据
|
最佳答案
查看完整内容[请看2#楼]
【已解决】首先很感谢原子哥的解答。
目前通过多方面的探索,问题已经得到解决。解决方案是“更换TJA1050芯片”,是的,再一次更换芯片之后CAN报文互发正常,逻辑分析仪抓取的报文也正常。下面贴上最终的结果。
1.下面是写好的程序,1向2发,2向1发,200ms一次。
2.下面是CAN报文接收中断函数,通过串口将数据发送至上位机监测,数据头是时间
3.下面是串口得到的数据,注意亚秒最大是255(0xFF),所以200ms对应的变化 ...
|