尝试用国芯的Ai8051U的SPI外设驱动W25Q128,忙活了一天也没有完全成功。记得使用Arduino的程序,是行得通的,结果查看Arduino程序时发现程序中使用的并非SPI外设,而是使用软件模拟方式驱动的。查看程序处理过程,并配合逻辑分析仪截取通讯过程的时序信号,以及查看W25Q128的数据手册,终于弄明白使用Ai8051U的SPI外设驱动W25Q128失败的原因了。
这里以读取W25Q128状态信息为例,通过逻辑时序图,进行分析。读取W25Q128状态信息的指令码为0x05。根据数据手册的说明,

发送指令时,是在CLK脉冲的上升沿,而从W25Q128读取状态信息时,是在指令的第8个脉冲的下降沿开始的。也就是说接收数据的第一个脉冲,与发送数据的第8个脉冲时共用一个脉冲的,其上升沿发送指令的B0位,其下降沿接收数据的B7位。也就是说,如果发送的指令是一个字节,接收数据是一个字节的情况下,需要发送给W25Q128的CLK脉冲总数是15个,而不是16个。下面是在Arduino程序下获得的实际通讯时序:

与手册上的说明是一致的。
这样的话,在使用标准的单片机外设的场合,就涉及到两个问题:
1、数据发收转换时,需要控制CLK脉冲的采样极性转换(上升沿、下降沿)。
2、即使能够即使实现CLK脉冲的采样极性转换,也不敢保证发送的第8个脉冲与接收的第一个脉冲时公用的。
因此,使用SPI外设访问W25Q128反而变得有些麻烦了,不如使用软件模拟方式方便了。
我要赚赏金
