CPOL和CPHA详解
CPOL 时钟极性
表示时钟CLK线空闲状态时高还是低
CPOL=0 空闲状态为低
CPOL=1 空闲状态为高
CPHA 时钟相位
表示第一个还是第二个边沿采集数据
CPHA=0 第一个边沿采集数据
CPHA=1 第二个边沿采集数据
SPI四种模式
我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。
以S3C2440 SPI控制器为例讲解四种模式
1、以OLED为案例分析SPI
数据手册的重点部分为:1、命令 2、时序
从时序图可以看出该器件可以选择模式0 和模式 3 上升沿采样,验证了以上观点
数据手册上的oled的时序如图:
模拟SPI参考代码:
static void OLEDWriteCmd(unsigned char cmd)
{
OLED_Set_DC(0); /* 0 command 模式 1 数据模式*/
OLED_Set_CS(0); /* select OLED 片选*/
SPISendByte(cmd); //发送命令
OLED_Set_CS(1); /* 取消片选 de-select OLED */
OLED_Set_DC(1); /*恢复为数据模式*/
}
void SPISendByte(unsigned char val)
{
int i;
for (i = 0; i < 8; i++)
{
SPI_Set_CLK(0);
SPI_Set_DO(val & 0x80); //高位在前
SPI_Set_CLK(1); //从低拉高 上升沿采样
val <<= 1;
}
}
2、以W25Q128 FLASH 为例分析SPI
重点关注:寄存器,命令,时序
以读ID为例:
/*读厂商ID*/
void ReadId()
{
u8 idbuf[2];
W25QXX_CS = 0; //选中
SPI2_ReadWriteByte(0x90);//发送读ID命令
SPI2_ReadWriteByte(0x00);
SPI2_ReadWriteByte(0x00);
SPI2_ReadWriteByte(0x00); //发送地址0x000000
idbuf[0] = SPI2_ReadWriteByte(0xFF);
idbuf[1] = SPI2_ReadWriteByte(0xFF); //读出id
W25QXX_CS = 1; //取消片选
}