网站搭建逻辑结构图,鼎湖网站建设,wordpress 初始化插件,网站建设网站排行1.CAN驱动架构
由于采用了RTT的spi device架构#xff0c;不能再随心所遇的编写CAN驱动 了#xff0c;之前内核虽然采用了RTT内核#xff0c;但是驱动并没有严格严格按RTT推荐的架构来做#xff0c;这次不同了#xff0c;上次是因为4个MCP25625挂在了4路独立的SPI总线上不能再随心所遇的编写CAN驱动 了之前内核虽然采用了RTT内核但是驱动并没有严格严格按RTT推荐的架构来做这次不同了上次是因为4个MCP25625挂在了4路独立的SPI总线上 这次2个mcp25625挂在1个SPI总线上同时此SPI总线上还挂载了1个铁电1个norflash且FM25V10我已经使用了spi device架构驱动起来了说实话用RTT的spi架构还很方便于是CAN驱动我也只能用spi架构。首先我遇到一个问题就是怎么处理mcp25625中断之前是在中断中操作spi总线接收数据的但在官方spi架构下这种方法行不通因为在RTT中不允许在中断中调用可能导致中断挂起的操作比如申请信号量、互斥互斥量等但spi架构的核心函数都要lockspibus这直接就导致系统死掉其实我测试发现不但不能在中断处理函数中调用可能导致中断挂起操作即使在RT_TIMER_FLAG_SOFT_TIMER定时器中这种操作也是被禁止的因为我想设计1个50ms定时器定时发送几个CAN帧发现直接在超时处理函数中发送CAN帧是不行的程序直接打印的原因是timer线程优先级为0在优先级为0 的线程是不被允许申请资源的于是我只能专门新建一个发送线程超时处理函数向此线程发送邮箱“发送线程”收到邮箱后触发发送动作。 接收线程也是类似这样的操作在mcp25625的中断处理函数中只发送邮箱而在设置了高优先级的接收线程内收到邮箱信息后 开启接收CAN帧动作。经过2天的调试基本可以实现MCP25625驱动。
2, mcp25625不连接CAN总线时发送死循环
OSM单次触发CAN正常情况下如果 发送不成功的话会一直尝试发送直到发送成功但是也可以设置发1次就需要使能此位正常情况禁止 这个与USB上的HOST会自动再发IN Token,非常像总线上不回应数据就一直询问这2个地方都是发送之后会产生1个中断造成系统一直在中断、中断处理死循环其它任务得不到执行。
解决办法也不一样
对于MERR中断 直接关闭MERR中断使能因为在中断处理函数中MERR中断处理非常简单就是清了一下中断标志禁止MERR中断也没有什么影响
对于USB IN taken产生NACK中断 只能减少中断次数 设置为1ms中断1次也能解决问题。
3, mcp25625接收丢数据
因为RTTHREAD效率问题也不好改而且用的是倍受争议的SPI HAL库同中接收数据不在中断中了在线程中这就导致了老是丢CAN数据了 试过了很多方法也没解决包括提高接收线程的优先级提高了6 仅次于timer系统记数器优先级结果还是不能最终通过提高SPI时钟频率解决因为SPI总线经连通了核心板与底板上面又挂了很多外设之前设置的是5Mhz直接提高到10Mhz,测试SPI总线正常收发数据正常CAN也没再丢数据先这个办了。