直奔主题,我是在原子哥F407例程的基础上想实现双机CAN通讯
我用的核心板为STM32-F407ZGT6,原理图上看到PA11、PA12引脚可以复用为CAN1_RX和CAN1_TX,在与CAN收发器接线时不要接错,PA11与收发器TXD相连,PA12与收发器RXD相连。收发器建议用HVP230,可以用板子3.3V供电;TJA1050也可以,不过需要5V供电,这点需要注意。
CAN的初始化:
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
//时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//PORTA时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//CAN1时钟使能
//GPIO初始化
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;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
//CAN引脚复用
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
//CAN单元设置
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=ENABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode= mode; //CAN模式设置
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); // 初始化CAN1
//配置过滤器
CAN_FilterInitStructure.CAN_FilterNumber=0;
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;//32位MASK
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 = 1; // 主优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
return 0;
}
中断处理函数为:
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN1, 0, &RxMessage);
for(i=0;i<8;i++)
printf("DATA[%d]:%drn",i,RxMessage.Data[i]);
LED1=!LED1;
}
发送函数就根据自己的需求设置ID,数据等,此处不表,例程里都有。
重点:主函数中两个板子的模式初始化不同!!!
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,Mode);
CAN1模式初始化中,前4位设置总线波特率为500Kbps,重点在于最后的Mode。原子哥例程和我看到的其他例程相同,都是可以选择自发自收或者普通模式。实际操作程序下到两块板子里,检查各自报文的自发自收也确实没有问题,但就是不能互相通讯。
查看STM32F4中文参考手册,CAN_Mode可以设置为静默、环回、环回与静默组合、正常模式。于是试着将其中一块板子的CAN模式改为静默模式(即只接收而不发送),另一块仍然是正常模式,结果接收消息没有问题!
泪流满面,仰天长啸啊,折腾了几天的问题原来这么简单。细细思考,自己一开始就没有仔细想过CAN报文ID冲突的问题,一套例程下到两块板子里,同时发送相同ID的CAN报文,总线上的仲裁机制失效,当然就不能够正常通讯了。如果想要实现两块板子的互发互收,就要设置不同ID的CAN报文。
以此为鉴,以后对待别人的东西,不仅要会用,还要能懂,最重要的是实践。否则就会像上文这样,因为小细节耽误很长时间。
上一篇:关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
下一篇:STM32的CAN总线的接收双FIFO使用方法
推荐阅读
史海拾趣
汇顶科技(GOODiX)公司发展的五个故事
故事一:初创与转型
汇顶科技的故事始于2002年,当时它作为一家初创企业,在电子产业中崭露头角。公司最初专注于固定电话芯片业务,但随着国内固话市场的饱和和竞争加剧,公司迅速调整方向,切入小家电触控面板芯片领域。这一转型为公司后续的发展奠定了基础。2010年,汇顶科技获得联发科技的战略投资,其触控芯片集成至联发科技的安卓系统解决方案中,广泛应用于智能手机和平板电脑等电子产品,进一步提升了公司的市场地位。
故事二:指纹识别技术的突破
2013年,随着苹果iPhone 5s发布并搭载电容式指纹识别技术,全球范围内掀起了一股指纹识别风潮。汇顶科技敏锐地捕捉到了这一市场趋势,开始研发指纹识别芯片。经过一年的努力,公司在2014年成功推出电容式指纹识别芯片,并凭借创新技术迅速获得国内主流智能机厂商的订单。此后,汇顶科技在指纹识别领域不断取得突破,逐步成为全球最大的指纹识别芯片厂商之一。
故事三:屏下指纹识别技术的开拓者
在指纹识别技术取得成功后,汇顶科技并未满足现状,而是继续探索新技术。2016年,公司开始以屏下指纹识别技术(光学式指纹芯片)为新的主攻方向。经过一年的研发,2017年汇顶科技率先展出全球首款屏下指纹识别技术,成为该领域的开拓者。随着全面屏手机的兴起,屏下指纹识别技术迅速得到市场认可,汇顶科技也借此迎来了新一轮的增长。
故事四:多元化布局与并购
为了进一步提升竞争力,汇顶科技通过并购等方式不断拓展业务领域。2018年,公司收购德国蜂窝半导体IP企业CommSoild,进军窄带物联网领域(NB-IoT)。2020年,汇顶科技又收购恩智浦半导体的语音及音频业务单元(NXP Voice & Audio Solutions)和德国汽车电子公司Dream Chip Technologies,分别增强智能终端音频解决方案能力和进入车规级芯片领域。这些并购不仅丰富了公司的产品线,也提升了公司在各领域的综合竞争力。
故事五:持续创新与合作
汇顶科技一直致力于技术创新和市场拓展。近年来,公司与多家知名手机厂商建立了合作关系,为其提供创新的指纹识别和触控芯片解决方案。例如,汇顶科技的创新方案组合助力小米、荣耀、iQOO等品牌的旗舰新品打造极致体验。同时,公司还不断拓展物联网领域的应用,通过构建芯片设计和软硬件产品技术综合物联网平台,推动智能化生活的实现。这些合作和创新不仅提升了公司的市场影响力,也为全球亿万消费者带来了更便捷、智能的体验。
为了进一步提升竞争力,ADC积极寻求与其他企业的战略合作。通过与业界领先的企业建立合作关系,ADC成功整合了各方资源,共同研发新技术、新产品。这些合作不仅加速了ADC的技术创新步伐,也为其带来了更多的商业机会。
在20世纪90年代初,Herga公司凭借其在精密电机技术上的突破,成功研发出一款高效能、低噪音的步进电机,迅速在自动化设备和电子设备市场中脱颖而出。这款电机不仅提高了生产效率,还显著降低了能耗和噪音水平,赢得了众多知名电子制造商的青睐。Herga公司借此机会,进一步拓展产品线,逐步确立了在电子行业精密传动组件领域的领先地位。
随着全球对环境保护和可持续发展的重视日益提高,ETIC也开始积极探索可持续发展的道路。公司致力于研发环保型集成电路产品,采用绿色生产工艺和材料,减少对环境的影响。同时,ETIC还积极参与社会公益事业和环保活动,推动企业与社会的和谐发展。这些努力使ETIC在电子行业树立了良好的企业形象和品牌形象。
以上五个故事是根据电子行业的一般情况和集成电路领域的发展特点虚构的。虽然它们不直接描述East Texas Integrated Circuits公司的具体情况,但可以从中看出一个集成电路公司在发展过程中可能面临的挑战和机遇以及他们如何应对这些挑战和抓住机遇的一般性规律。
凭借卓越的产品性能和稳定的市场表现,爱普特半导体的市场占有率持续提升。目前,公司在国内非ARM核MCU市场的出货量已经位居第一,市场占有率也遥遥领先。这一成绩的取得,不仅彰显了爱普特在MCU行业的领先地位,也反映了公司在技术创新和市场拓展方面的强大实力。随着公司研发能力的不断提升和市场布局的逐步完善,相信爱普特在未来的市场竞争中将继续保持领先地位。
这些故事只是爱普特半导体发展过程中的一部分,它们共同展现了公司在电子行业中的崛起和成长。作为一家坚持自主创新、构建高端人才队伍、与大型企业战略合作、践行纯国产化发展理念并持续提升市场占有率的企业,爱普特半导体在电子行业的发展道路上正稳步前行。
2001年,位于美国加利福尼亚州圣荷塞市的Discera公司正式成立,由一群热衷于半导体技术的工程师和投资者共同创立。他们看到了CMOS MEMS谐振器技术的巨大潜力,并决定将其作为公司的核心业务。经过数年的研发和测试,Discera终于成功开发出了一款性能优越的CMOS MEMS谐振器,该产品具有防震效果强、温度稳定性好和频率可编程性等显著优势。
Freescale 的 VPU 视频解码后怎么显示到指定的窗口控件上 我用Freescale Mx27 中的VPU进行 视频的编解码 ,解码后如何将视频帧显示到指定的窗口控件中呢, … 查看全部问答∨ |
|
s3c2410的nand flash在烧写后,启动出错,求救 s3c2410上烧wince的bootloader,烧写过程没错,但重启后出错 超级终端启动后,屏幕出现如下信息: WinCE NAND Boot v1.00 Mar 22 2007 00:02:34 Picture Boot WinCE NAND Boot v1.00 Mar 22 2007 12:25:45 dwEntry is 0x00000001 ECC ERROR ...… 查看全部问答∨ |
正在用keil for arm学习LPC2312,用proteus联调 我在main.c中定义了一个全局变量led_flag和led_taber[16]的数组, 我主要是要完成用LPC2312的p0.0-p0.6这7个口作为输出来控制7段数码管显示0 1 2 …E F十六个数字 用p0.7,p0.9作为外部中断输入, ...… 查看全部问答∨ |
GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 这个两句,不管用不用,PB6-PB9都有信号输出,而PD12-PD1 ...… 查看全部问答∨ |
|
视频: $(\'swf_JnJ\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XNDE5Nzc2M ...… 查看全部问答∨ |