老师您好,有几个i2c的问题要请教一下,我用了例程中的app_i2c.c库函数,在串口转i2c通讯的时候,快速频繁收发数据时,偶尔会死机,我怀疑是不是总线总裁方面的问题,或者是中断优先级的问题,请问老师各个中断的优先级从哪个函数里面设置,还有总站总裁是自动的还是需要配置一下的?如果需要配置,在哪个函数里配置?谢谢老师
您好,您用的是582的硬件IIC主机还是从机,主机的话可以先用GPIO模拟IIC调试,参考代码见模拟I2C主机(CH579 CH573 CH582) - debugdabiaoge - 博客园 (cnblogs.com)。
调整中断优先级可以使用函数 PFIC_SetPriority() 。
总线仲裁是硬件自带功能,只可选择是否上报错误,默认开启。建议开启上报功能,即置位I2C_STAR1寄存器的ARLO位,这样出现总线相关异常时会有上报提示,关闭上报功能并不会使波形正常。您手头若有逻辑分析仪等抓包工具,可以抓个包检查一下主线仲裁出错时的SDA上的波形,是否在传输过程中受到串扰。
您可以将主/从机设备型号、调试代码、打印截图等信息发送至邮箱zhaiyw@wch.cn,年后我们会尝试复现和定位问题。
感谢工程师回复,我用的是ch582m 使用的是硬件iic 要求是没有操作时处于从机接收模式 用来接收另一个系统发来的指令,当有操作时转换为主机模式 对另一个系统发送数据,我再研究一下看看 有问题在请教您 感谢感谢 另外问一下 582是否可以设置两个从机地址?我想让它代替两个不同地址的i2c从机设备,我看32v203介绍好像可以,
可以设置双从机地址的,CH58x.i2c.c文件中有配置函数如下。
IIC中断处理过程中也要注意一下带有_SECONDADDRESS_的宏,使用了与第一地址不同的数值。
感谢老师指导!!我学习一下!!
问题已经解决了,打扰老师了
老师您好,还要麻烦咨询个问题,PFIC_SetPriority() 中断优先级函数,这个得具体用法能否给说一下,我看可设置得中断总共是21个,函数说明 4-6bit和7bit 各控制抢占优先级和次优先级,不太明白这个怎么设置,麻烦老师有时间给说一下,谢谢
优先级都是数值越小,优先级别越高。
抢占优先级决定是否能够嵌套运行中断。当第7位的抢占优先级更高时,可以嵌套抢占当前正在运行的抢占优先级更低的中断。同级抢占优先级不能嵌套,需等待前一个中断执行完成。582有2级中断嵌套,即只能抢占一次。
副优先级决定同时产生中断时,先处理哪个中断(非嵌套)。在同级抢占优先级的情况下,若同时产生两个中断,先处理副优先级高的。在同级抢占优先级的情况下,新产生的高副优先级中断,仍要等待正在进行的低副优先级中断。如果两个中断的抢占优先级和副优先级都相同,则查下表按顺序处理。
感谢老师这个也最解决了,还有个问题请教,串口中断 超时接收说是等待4个数据时间,请问老师4个数据时间是多久?是接收4字节需要的时间吗?谢谢
4个数据的时间要根据波特率和其他串口配置来,1个起始位,8个数据位,1个停止位,115200波特率下,4个数据的时间大概是4*(1+8+1)/115200(s)
请问老师 串口接受超时中断的等待时长是4个数据时间,这个时间能不能修改,比如改成2个数据时间或者3个数据时间
这个改不了,没有相关寄存器可以配置该项。