历史上的今天
今天是:2024年09月30日(星期一)
2019年09月30日 | STM32 CAN 通讯发送不能连续,不能接收
2019-09-30 来源:eefocus
1. 今天调试CAN, STM32F334C8T6,做一个生物PCR监测的项目,用到CAN,程序写完后,调试,发现发送只能发送16帧,而且不能接收,用的是USB2CAN
2. 检查程序初始化部分如下
u8 CAN1_Init(u16 BaudRate,u8 mode)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure={
.GPIO_Pin = GPIO_Pin_12,
.GPIO_Mode = GPIO_Mode_AF, //复用功能
.GPIO_OType = GPIO_OType_PP, //推挽输出
.GPIO_Speed = GPIO_Speed_50MHz, //100MHz
.GPIO_PuPd = GPIO_PuPd_NOPULL, //上拉
};
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
GPIO_InitTypeDef GPIO_InitStructure11={
.GPIO_Pin = GPIO_Pin_11,
.GPIO_Mode = GPIO_Mode_AF, //复用功能
.GPIO_OType = GPIO_OType_PP, //推挽输出
.GPIO_Speed = GPIO_Speed_50MHz, //100MHz
.GPIO_PuPd = GPIO_PuPd_UP, //上拉
};
GPIO_Init(GPIOA, &GPIO_InitStructure11);//初始化PA11,PA12
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_9);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_9);
//CAN单元设置
CAN_InitTypeDef CAN_InitStructure={
.CAN_TTCM=DISABLE, //非时间触发通信模式
.CAN_ABOM=DISABLE, //软件自动离线管理
.CAN_AWUM=DISABLE, //睡眠模式通过软件唤醒
.CAN_NART=ENABLE, //禁止报文自动传送
.CAN_RFLM=DISABLE, //报文不锁定,新的覆盖旧的
.CAN_TXFP=DISABLE, //优先级由报文标识符决定
.CAN_Mode= mode, //模式设置
.CAN_SJW=CAN_SJW_1tq, //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位
.CAN_BS1=CAN_BS1_6tq, //CAN_BS2_5tq,Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
.CAN_BS2=CAN_BS2_5tq, //CAN_BS1_6tq,Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
.CAN_Prescaler=BaudRate, //12,BaudRate,分频系数(Fdiv)为brp+1
};
CAN_Init(CAN1, &CAN_InitStructure);// 初始化CAN1//配置过滤器
CAN_FilterInitTypeDef CAN_FilterInitStructure0={
.CAN_FilterNumber=CAN_Filter_FIFO0, //过滤器0
.CAN_FilterMode=CAN_FilterMode_IdMask,
.CAN_FilterScale=CAN_FilterScale_32bit, //32位
.CAN_FilterIdHigh=00, //16, 32位ID
.CAN_FilterIdLow=0x0000,
.CAN_FilterMaskIdHigh=0x0000, //0xff,32位MASK
.CAN_FilterMaskIdLow=0x0000,
.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0,//过滤器0关联到FIFO0
.CAN_FilterActivation=ENABLE, //激活过滤器0
};
CAN_FilterInit(&CAN_FilterInitStructure0); //滤波器初始化
CAN_FilterInitTypeDef CAN_FilterInitStructure1={
.CAN_FilterNumber=CAN_Filter_FIFO1, //过滤器1
.CAN_FilterMode=CAN_FilterMode_IdMask,
.CAN_FilterScale=CAN_FilterScale_32bit, //32位
.CAN_FilterIdHigh=0x00FF, //网络参数更改
.CAN_FilterIdLow=0x0000,
.CAN_FilterMaskIdHigh=0x00FF, //32位MASK
.CAN_FilterMaskIdLow=0x0000,
.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1, //过滤器0关联到FIFO0
.CAN_FilterActivation=ENABLE, //激活过滤器0
};
CAN_FilterInit(&CAN_FilterInitStructure1); //滤波器初始化
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO1消息挂号中断允许
NVIC_InitTypeDef NVIC_InitStructure0={
.NVIC_IRQChannel = CAN1_RX0_IRQn,
.NVIC_IRQChannelPreemptionPriority = 1, // 主优先级为1
.NVIC_IRQChannelSubPriority = 0, // 次优先级为0
.NVIC_IRQChannelCmd = ENABLE,
};
NVIC_Init(&NVIC_InitStructure0);
CAN_ITConfig(CAN1,CAN_IT_FMP1,ENABLE); //FIFO1 消息挂号中断允许
NVIC_InitTypeDef NVIC_InitStructure1={
.NVIC_IRQChannel = CAN1_RX1_IRQn,
.NVIC_IRQChannelPreemptionPriority = 1, // 主优先级为1
.NVIC_IRQChannelSubPriority = 2, // 次优先级为0
.NVIC_IRQChannelCmd = ENABLE,
};
NVIC_Init(&NVIC_InitStructure1);
return 0;
}
波特率是250K,计算一下 36MHZ/分频/(1+6+5),CAN_SJW_1tq,CAN_BS1_6tq,CAN_BS2_5tq,刚好是250K
GPIO看了文档也是OK
滤波器设置也是参照我以前的407的(CAN OK),
3.检查了发送程序
u8 CAN_DataSend(MsgFrame const Msg)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
BIT32 ExtID;
//源地址
ExtID.Bit8.Bit8[3] = 16;
//目的地址
ExtID.Bit8.Bit8[2] = Msg.MsgInfo.fAddr;
//指令
ExtID.Bit8.Bit8[1] = Msg.Bit8[3];
ExtID.Bit8.Bit8[0] = 0;
TxMessage.StdId = 0x0; // 标准标识符为0
TxMessage.ExtId = ExtID.Int>>3; // 设置扩展标示符(29位)
TxMessage.IDE = CAN_Id_Extended; // 使用扩展标识符
TxMessage.RTR = 0; // 消息类型为数据帧,一帧8位
TxMessage.DLC = 8; // 发送两帧信息
//拷贝数据
memcpy(&TxMessage.Data[i],&(Msg.Bit8[5]),8);
//传输数据
mbox= CAN_Transmit(CAN1, &TxMessage);
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
i++;//等待发送结束
if(i>=0XFFF)return 0;
return 1;
}
和以前也是一样的,同时,用逻辑分析器,看也有波形。也有数据,但为啥还是不能连续发送呢?有点迷茫
4. 还是再看看电路图吧(不是我画的,我同事画的),发现没有接120R电阻,以前记得要接120R,找同事要几个120R电阻
接上去,测试,发现OK。
5.测试一下接收,也是OK
void CAN1_RX0_IRQHandler(void)
{
if(CAN_GetFlagStatus(CAN1,CAN_FLAG_FMP0))
{
memset(&CANRxBuffer,0,sizeof(CanRxMsg));
CAN_Receive(CAN1, CAN_FIFO0, &CANRxBuffer);
if(CAN1FrameHandler!=NULL)
{
CAN1FrameHandler();
}
}
CAN_ClearFlag(CAN1,CAN_FLAG_FMP0);
}
6. 折腾了一天的问题,终于解决了。
下一篇:STM32F4的CAN通信讲解
史海拾趣
|
嵌入式开发入门之经典 开始进入嵌入式世界,真是一头雾水,不知道如何入手!也不知道该如何学习,学习什么,最近从网上转载这篇文章,对我启发很大,对于初始进入嵌入式的人们很有帮组,好多嵌入式大侠都说这是入门的最好文章. 1、抓住51开发ARM 这 ...… 查看全部问答> |
|
我想自己做一个播放器,大致功能如下 功能 1、通过VGA(主要接液晶电视)或者AV输出,能够顺畅播放realplay所支持的影视格式。 2、通过无线网络访问其他计算机的文件。 大致列了如下配置单: 硬件配置表 1、CPU主频400MHz 以上 2、64MBtyes SD ...… 查看全部问答> |
|
我最近做一个项目,关于自动售货机掉货检测的。 其中自动售货机的主控系统与其他从设备之间的通信是基于MDB协议的 在掉货检测这个从设备中,我使用的AT89C51单片机 我想问下 如何设计这个通信协议才能使自动售货机的主控系统和掉货检测这个从设 ...… 查看全部问答> |
|
运行结果提示:the arc between pins \'CK\' and \'D\' is negative, which is not allowed. To make it positive, the maximum hold value has been adjusted from 0.729405 to 0.782819.请问:1. 修改那里,才能保证是正值。 ...… 查看全部问答> |
|
今天看到一个定义窗口的函数windows(x1,x2,y1,y2), void Define_Window(unsigned char data X0, unsigned char data Y0, unsigned char data X1, unsigned char data Y1) { Write_Cmd(0x2A); Write_CMD_Data(X0); Write_CMD_Data(X ...… 查看全部问答> |
|
710手册Rev.6版本(2005.4)上: H8:P1.12/CANTX G12:P1.11/CANRX F12:NC 710手册Rev.12版本(2008.2)上: H8:P1.12/CANTX G12:NC F12:P1.11/CANRX 请版主确定一下,哪一个是正确的,我设计时用户是Rev6,PCB板的F12没引出,无法测 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:27 编辑 我要做一个语音端点检测的程序,用的vpm642的开发板,aic23b语音芯片,用EDMA输入和输出采集的语音信号,使用了输出和输出两个pingpong缓存,在输入ping或pong缓存接受完数据后产生中断,将数据做fft ...… 查看全部问答> |




