为什么叫CAN的验证,因为我这里并没用环回模式,但也没两个板子,就算有两个板子,也不知道是否适合STM32以外的系统,就算是不适合的系统,如果出现问题,都不知道怪谁,所以,只好搞了个USB-CAN转换器.因为博主很穷,所以只好搞了个弱逼的USB-CAN,其他应该大同小异.
的其实这货里面就CP2102啊,还有一个PIC单片机,还有CAN芯片,一拆真简陋.如果大家担心的话,可以去淘宝找这货,如果不担心,自己随便找找呗.首先这货需要先设置波特率,然后什么都不过滤,如序号1,序号2:
而STM32的CAN配置没什么难度的,最大的难度,应该就是波特率设置了.其中波特率公式如下:
波特率:48M (kHz) /((TBS1 + TBS2 + 3)*BRP)
比如说要得到500kbps,首先已知APB1=84MHz,也就是48000kHz,84000/x,其中x有一个组合是16*6,所以我们CAN波特率可是:
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_7tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq; CAN_InitStructure.CAN_Prescaler = 6; CAN_Init(CAN1, &CAN_InitStructure);
的其他并没特别大的问题,如果熟悉CAN的结构...如果不熟悉CAN结构,那就需要先学习CAN了.首先发送报文,长这个样子:
void Can1WriteData(uint16_t ID) { CanTxMsg TxMessage; /* transmit */ TxMessage.StdId = ID; //TxMessage.ExtId = 0x00; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = CAN1_DATA0; TxMessage.Data[1] = CAN1_DATA1; TxMessage.Data[2] = CAN1_DATA2; TxMessage.Data[3] = CAN1_DATA3; TxMessage.Data[4] = CAN1_DATA4; TxMessage.Data[5] = CAN1_DATA5; TxMessage.Data[6] = CAN1_DATA6; TxMessage.Data[7] = CAN1_DATA7; CAN_Transmit(CAN1,&TxMessage); }
就是声明是什么帧,长度多少,然后发送,就可以了,非常简单.接受也差不多.程序示例图,接收在中断内处理:
程序下载:CAN收发实验