关于调试SPI、I2C、UART的记录

来源:互联网 发布:酒店点菜软件 编辑:程序博客网 时间:2024/05/22 04:30
智慧的价值无人能知。
                                                                           ——旧约
·约伯记【28:13】


 最近用到的MCU型号为ASM9260,在写相关驱动时遇到了一些麻烦,以下做记录以便谨记。

1.SPI上,使用DMA进行读写FLASH数据。出现的现象为:擦除FLASH之后,读出的值为0xFF,写入一些数据后,读出的值与写入的值不一致,读写值的规律例如每一次写入的是0x3C,读出的都是0x08,每一次写入的是0x2B,读出的是0xE0,就是说每一个字节的写入它都会有与之对应的另一个字节读出,只是不相等而已。由于读写擦除的过程中程序并没有提示任何错误故可判断程序中SPI初始化以及相关DMA的初始化都没有问题,这一点也在大神同事的检查代码之后得以验证。后来观察板子之后可以看到MCU与FLASH的距离大概有四五十厘米的距离,这个长度确实有点偏长,之前使用的是SPI的时钟为20M,之后按照大神的建议将其改为10M,调试成功。
总结:配置SPI的时候,由于SPI一般都不是模拟的,所以
        ①检查软件配置,最好与可用的配置代码进行比较分析
        ②使用万用表查看SPI和MCU器件是否供电正常
        ③使用示波器查看对应的SPI引脚上是否有SPI信号,即查看IO口配置是否正确。
        ④查看板子的器件布局,若MCU与SPI器件距离过远,降低时钟通讯在5M10M左右,近一点的可以使用15M20M的。
        ⑤最后可以使用逻辑分析仪捕捉SPI时序,查看是否存在问题。
        ⑥如果SPI是模拟实现的,需要使用逻辑分析仪查看时序是否规范规整。

2.I2C上,使用IO口模拟I2C主机通讯。这个在之前的文章中都有描述。 由于这次有两条I2C总线,每条总线上都挂载了一些I2C器件,两条总线上都出现了不能进行正常通讯的器件。先说第一路,不能通讯的是IDT5901B(用来配置输出时钟的)。出现的现象为:同一条总线上的IT8563WE都能正常读写I2C数据,在跟IDT5901B通讯时,发送器件地址后无ACK响应。首先想到的是地址是不是有错,查看手册,默认情况下地址为0xD4,还有一种情况下会有0xD0,但是都试过了都不行。最后发现SDA和SCL线接反了,确实比较尴尬的。另一路上的芯片是SiI9022,发现也是发送器件地址之后没有ACK响应,由于这个器件在配置之前需要复位,所以一开始怀疑复位后的延时时间太短,但是后来通过示波器观察之后,复位延时和I2C时序都正常,就是没有ACK响应。后来尝试在第一次失败之后,重新再发起一次通讯,就好了。因为之前用过9022芯片都是一次通讯成功,这一次最后结果都是第一次失败第二次成功。
总结:配置I2C的时候,也需要根据是不是模拟实现的进行区分排查问题,
        
① 若是硬件实现的需要检查配置是否正确,最好与可用的配置代码进行比较分析
        ② 使用万用表查看I2C器件供电是否正常
        ③ 查看配置的IO口是否正确,使用示波器查看是否有I2C信号,SCL和SDA的连接是否正确。
        ④ 使用示波器查看I2C信号是否正确,时序是否规范规整
        ⑤ 查看I2C速率是否匹配,模拟I2C的速率主要依靠调整延时时间进行修改。
        ⑥ I2C器件总线一般SDA和SCL上都需要上拉电阻,4.7K上拉到3.3V(这个电阻值可以认为是经验值,电阻值偏小,不容易拉到低电平,电阻值偏大好像也不行)

3.UART上, MCU通过UART0与DSP通讯,通讯流程是:MCU向DSP发送hello,DSP接收完hello之后,向MCU发送hello,MCU接收到hello之后,向UART1和UART5发送fch,接着继续向DSP发送hello,并继续循环。另外在监测UART0和UART5中通讯的数据时需要外接一个TTL转232的小板需要接往PC,UART1有另外的口无需外接小板。现在的现象是:小板接在UART5上时,UART5和UART1上都没有发出fch。当将小板接在UART0上时,UART0上有输出hello,UART1上有输出fch。查看示波器发现MCU发出的信号正常,DSP发出的信号不是方波。最后在MCU的RX端接上一个10K的电阻,拉至5V后通讯正常。一般情况下串口上不需要上拉电阻,但是实际情况下根据示波器量出的波形分析,在DSP向MCU传输数据时,无法成功置为高电平,导致出现非方波的信号。
总结:配置UART时,需要注意的有以下几点,
        
① 检查配置是否正确,包括波特率、数据位、校验等,最好与可用的配置代码进行比较分析(这个还是比较重要的,之前的日志中提到过有一些特定的MCU在配置时感觉无关紧要,但是在实际情况下确实有影响。)还有一些什么数据能发送,但是中断不能产生之类的,基本上都是软件配置的问题。
        ② 使用万用表查看供电情况,不怕一万就怕万一
        ③使用示波器查看串口信号是否存在并且是否正确
        ④硬件检查上的IO连接是否正确也需要检查

以上谨作记录。
原创粉丝点击