CAN双机通信经验分享
楼上:如果你只有一部STM32,那么是没有必要使用中断的。这时。主程序大概是这样的:在进入for()前CAN_Polling()只执行1次,然后你判断返回的标志位去显示LED.如果要不断发送,就把该函数移到循环中。
int main(void)
{
//片内硬件初始化
FAG=CAN_Polling(); //如果没有节点通信,则使用自发自收通信 FAG是预先定义的标志位
// CAN_Interrupt();//如果有节点通信,则使用节点通信
for(;;)
{
//FAG=CAN_Polling();移到这里就可以反复发送接收。
//这里加入你要显示结果的函数
}
}
bool CAN_Polling(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
CanRxMsg RxMessage;
u16 i=0;
u8 TransmitMailbox;
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; //时间触发
CAN_InitStructure.CAN_ABOM=DISABLE; //自动离线管理
CAN_InitStructure.CAN_AWUM=DISABLE; //自动唤醒
CAN_InitStructure.CAN_NART=ENABLE; //自动重传(注意,DISABLE才是自动重传)
CAN_InitStructure.CAN_RFLM=DISABLE; //失能FIFO锁定模式
CAN_InitStructure.CAN_TXFP=ENABLE; //失能FIFO优先级
CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; //环回模式,自发自收
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=5;
CAN_Init(CAN1,&CAN_InitStructure);
/* CAN 过滤器设置 */
CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器编号(0-13)
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=0;//CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* transmit */
TxMessage.StdId=0x11;
//TxMessage.ExtId=0x34;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.IDE=CAN_ID_STD;
TxMessage.DLC=2;
TxMessage.Data[0]=send_adc&0xff;; //这里传送的已经是ADC的数据了。
TxMessage.Data[1]=send_adc8;
TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);//这句是发送
i=0;
while((CAN_TransmitStatus(CAN1,TransmitMailbox)!=CANTXOK)&&(i!=0xFF)) i++;
i=0;
while((CAN_MessagePending(CAN1,CAN_FIFO0)
RxMessage.StdId=0x00;
RxMessage.IDE=CAN_ID_STD; //标准包
RxMessage.DLC=2;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);//这里是接收
if (RxMessage.StdId!=0x11) return FALSE;
if (RxMessage.IDE!=CAN_ID_STD) return FALSE;
if (RxMessage.DLC!=2) return FALSE;
if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xAAAA) return FALSE;
return TRUE;
}
如果你使用单机进行调试,又打开了CAN中断,则有可能因为没有节点,使中断程序一直挂起。
写错了:是R50和R51。
或如下图
我把自循环的源代码整个工程都上传大家共享。 下载后解压缩,编译后执行,ADC我是设定在原来超声波的接口通道9,你可以在代码中修改到你所需要的通道。
点击进入下载CAN自测试.rar
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |