前次在学习使用Ai8051U的SPI外设读写W25Q128时,没有成功。在大佬jobs的提示下,今天重新捡起来。参考学习其它单片机的驱动模式,终于弄明白失败的原因了。
SPI的工作模式,根据CPOL和CPHA的设置,有四个模式。在驱动W25Q128的时候,应该设置CPOL=1,CPHA=1,也就是说让SCK平时处于高电平,在SCK脉冲的下降沿采样数据。
按照这个模式,SPI的初始化程序:
/************************************************ 初始化SPI接口 入口参数: 无 返回值: 无 ************************************************/ void spi_init(void) { SS = 1; SPCTL = 0x50; //使能 SPI 主机模式, //00: P1.4 P1.5 P1.6 P1.7, 01: P2.4 P2.5 P2.6 P2.7, 10: P4.0 P4.1 P4.2 P4.3, 11: P3.5 P3.4 P3.3 P3.2 SPI_S1 = 0; //01: P2.4(SS)、P2.5(MOSI)、P2.6(MISO)、P2.7(SCK) SPI_S0 = 1; // CPOL=1(SCK平时为高),CPHA=1(下降沿有效), CPOL=1; CPHA=1; SPSTAT = 0xc0; //清中断标志 //ESPI = 1; //使能 SPI 中断 }
程序运行起来后,从逻辑分析仪得到的读取数据的时序信号:
可以看到修改了设置之后,在发送完MOSI数据后,在SCK的最后一个脉冲的下降沿开始读取来自Flash的数据(MISO)。读出来的数据与预先在Flash中设置的数据是一致的。
程序的Log输出: