关于IO模拟时序(SPI)的注意事项
原则:有硬件I2C、SPI时尽量用硬件操作,省去IO模拟繁琐的时序调试。但在内部资源不够时就要用IO模拟总线了。
关于短延时:模拟时序时是否需要延时要看MCU与device的相对速度。比如I2C如果400K的速率和MCU动辄几十M的速率不再一个量级,肯定要通过延时调整时序;但对于SPI因为其速度很高,甚至有的比单片机的速度还高,这时就没必要延时了。
关于IO模拟的收发函数是否要合并成一个:对于SPI因为是全双工,所以可以分开,当然也可以合并成一个(发送时不需要返回值,而接收时此时参数是要发送的数据,返回值是要读的值)
关于在什么跳变沿操作:比如芯片手册中说到在上升沿采样/锁定(也就是从上升沿开始到下降沿开始之间的时间数据的值必须稳定不变),那么单个位bit的收发都应该在1->0->1(后一个高电平之前)完成数据交互变化。
关于时钟极性和时钟相位:CPOL时钟极性只是说明了空闲时总线的电平状态:CPOL=1表明空闲时时钟是高定平;否则是低电平。
CPOA时钟相位说明了在第几个跳变沿进行采样,CPOA=0表明在第一个沿进行采样,否则在第二个沿。
模式 | CPOL | CPHA | 备注 |
---|---|---|---|
Mode0 | 0 | 0 | 数据采样是在上升沿,数据发送是在下降沿 |
Mode1 | 0 | 1 | 数据采样是在下降沿,数据发送是在上升沿 |
Mode2 | 1 | 0 | 数据采集是在下降沿,数据发送是在上升沿 |
Mode3 | 1 | 1 | 数据采集是在上升沿,数据发送是在下降沿 |
主器件是在何时刻输出bit1的呢:bit1的输出时刻实际上在SCK信号有效以前,比SCK的上升沿还要早半个时钟周期。bit1的输出时刻与SSEL信号没有关系。
主器件的输入口MISO何时读bit:同样是在时钟的前沿采样从器件输出的bit1的
从器件又是在何时刻输出bit1的呢:从器件是在SSEL信号有效后,立即输出bit1,尽管此时SCK信号还没有起效。