完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电源控制部分原理图: 1.PWR_EN:电源芯片使能引脚,大于2V开启输出 TJA1145部分原理图:
单片机部分原理图:
JTA1145-SPI读写时序图: 重点: 1.CLK空闲时刻为低电平 2.数据在下降沿采样 SPI驱动代码 为了提到代码的通用性,这里选择使用模拟SPI接口来操作TJA1145芯片的寄存器,SPI驱动代码如下: #define DelayCnt 1000 // 延时 void Delay_us(uint32_t t) { while(--t); } // SPI 读写驱动 uint8_t hw_spi_send( uint8_t *txData, uint8_t *rxData, uint8_t bytes) { uint8_t i,j; CS_Write(0); //CS =0; CLK_Write(0); //CLK =0; Delay_us(DelayCnt); for(i=0;i { for(j=0;j<8;j++) { CLK_Write(1); MOSI_Write( (txData>>(7-j) & 0x01) ); Delay_us(DelayCnt); CLK_Write(0); rxData |= ( MISO_Read() << (7-j) ); Delay_us(DelayCnt); } } CS_Write(1); Delay_us(DelayCnt); return 0; } JTA1145寄存器介绍: 控制寄存器: 0x01:模式控制寄存器,进入休眠,正常,待机模式,通过设置该寄存器 0x03:主状态寄存器 0x04:系统事件使能寄存器 0x06:内存相关,可以忽略 0x07:内存相关,可以忽略 0x08:内存相关,可以忽略 0x09:内存相关,可以忽略 0x0A:寄存器锁定,解锁控制寄存器(非常重要) 发送控制,CAN网络校验寄存器(用于设置CAN唤醒,ID,数据过滤) 0x20: 0x22: 0x23: 0x26: 0x27: 0x28: 0x29: 0x2A: 0x2B: 0x2C: 0x2D: 0x2E: 0x2F: 0x68: 0x69: 0x6A: 0x6B: 0x6C: 0x6D: 0x6E: 0x6F: 唤醒引脚控制状态寄存器: 0x4B: 0x4C: 0x60: 0x61: 0x63: 0x64: ID表示寄存器: 0x7E:该寄存器可以读出芯片标识,能正确读取出该参数,则可以说明SPI读取驱动已经正常 这里只说明部分重要寄存器: 0x0A: 寄存器锁控制,部分寄存器默认处于锁定状态,建议操作前,先关闭所有寄存器的锁定状态,否则可能导致寄存器无法写入 下面以CAN指定ID唤醒方式为例,列举寄存器设置方法和参数设置: #define Filter_Baud 0x03 // 0x00-50K 0x01-100K 0x02-125K 0x03-250K 0x05-500K 0x07-1M #define Filter_ID_Type 0x80 // 0x40 标准帧 0x80 扩展帧 #define Filter_ID_Data 0x03 // ID值 1. Write_Reg_TJA1145(0x0A,0x00); // 寄存器解锁 2. ret = Read_Reg_TJA1145(0x61); // 查询事件标志 3. Write_Reg_TJA1145(0x61,ret); // 清除事件标志 4. ret = Read_Reg_TJA1145(0x63); // 查询事件标志 5. Write_Reg_TJA1145(0x63,ret); // 清除事件标志 6. ret = Read_Reg_TJA1145(0x64); // 查询事件标志 7. Write_Reg_TJA1145(0x64,ret); // 清除事件标志 8. Write_Reg_TJA1145(0x23,0x01); // 使能CAN唤醒事件 9. Write_Reg_TJA1145(0x2B,0x00); // 设置CANID过滤器掩码 10. Write_Reg_TJA1145(0x2C,0x00); // 设置CANID过滤器掩码 11. Write_Reg_TJA1145(0x2D,0x00); // 设置CANID过滤器掩码 12. Write_Reg_TJA1145(0x2E,0x00); // 设置CANID过滤器掩码 13. Write_Reg_TJA1145(0x27,Filter_ID_Data>>0); // 设置CANID过滤器值 14. Write_Reg_TJA1145(0x28,Filter_ID_Data>>8); // 设置CANID过滤器值 15. Write_Reg_TJA1145(0x29,Filter_ID_Data>>16); // 设置CANID过滤器 16. Write_Reg_TJA1145(0x2A,Filter_ID_Data>>24); // 设置CANID过滤器 17. Write_Reg_TJA1145(0x2F,Filter_ID_Type); // 标准帧,扩展帧选择 18. Write_Reg_TJA1145(0x26,Filter_Baud); // 波特率设定 19. Write_Reg_TJA1145(0x20,0x31); // 使能CAN指定ID唤醒 20. Write_Reg_TJA1145(0x01,0x01); // 进入休眠 如果需要同时开启外部引脚唤醒,需要设置一下0x4C寄存器的值: 0x01:下降沿唤醒 0x02: 上升沿唤醒 0x03: 双边沿唤醒 重点部分: 翻译如下: 如果TJA1145收到一个包含错误的CAN消息(例如一个“填充”错误)在ACK字段之前传输。一个内部错误计数器开始递增,如果在ACK字段前没有出现任何错误而接收到CAN消息,则计数器递减。接收到的数据在CRC分隔符之后和下一个SOF之前被部分网络模块忽略。如果计数器溢出(计数器>31),捕获帧检测错误(PNFDE = 1)和设备唤醒:计数器复位为零时,错误被关闭和校验网络重新启用。 实际测试发现: 如果设置的波特率与当前总线上波特率不一致,则会产生上述所说的帧检测错误,如果当前芯片处于休眠模式,则会被唤醒!意味着如果芯片休眠以后,发送一个错误波特率的数据,则无论ID和数据是否能够与设定的过滤参数匹配,芯片都会被唤醒! 这个不知道算不算是一个芯片设计的bug,楼主详细阅读了全部芯片手册,依然未能找到,关闭错误检测的方法,如果有工程师知道解决办法,可以在下面留言回复,楼主先在此表示感谢! 至此关于TJA1145芯片的总结就结束了。 |
|
|
|
只有小组成员才能发言,加入小组>>
3324 浏览 9 评论
3003 浏览 16 评论
3498 浏览 1 评论
9077 浏览 16 评论
4094 浏览 18 评论
1199浏览 3评论
615浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2343浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1902浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 06:11 , Processed in 1.195106 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号