SPI的四种模式
SPI的相位(CPHA)和极性(CPOL)分别可以为0或1,对应的4种组合构成了SPI的4种模式(mode)
Mode 0:CPOL = 0,CPHA = 0
Mode 1:CPOL = 0,CPHA = 1
Mode 2:CPOL = 1,CPHA = 0
Mode 3:CPOL = 1,CPHA = 1
时钟极性CPOL(设置时钟空闲时的电平):即SPI空闲时,时钟信号SCLK的电平。(0:空闲时低电平,1:空闲时高电平)
时钟相位CPHA(设置读取数据和发送数据的时钟沿):即SPI在SCLK第几个边沿开始采样。(0:第一个边沿开始,1:第二个边沿开始)
CPHA = 0,表示第一个边沿:
对于CPOL = 0,空闲时是低电平,第一个边沿就是从低到高,所以是上升沿。
对于CPOL = 1,空闲时是高电平,第一个边沿就是从高到低,所以是下降沿。
CPHA = 1,表示第二个边沿:
对于CPOL = 0,空闲时是高电平,第一个边沿就是从高到低,所以是下降沿。
对于CPOL = 1,空闲时是低电平,第一个边沿就是从低到高,所以是上升沿。
CPOL=0,CPHA=1 模式
u8 SOFT_SPI_RW(u8 byte)
{
u8 i,Temp=0;
SPI1_SCK = 0;
for(i=0;i<8;i++) // 循环8次
{
SPI1_SCK = 1; //拉高时钟
if(byte&0x80)
{
SPI1_MOSI = 1; //若最到位为高,则输出高
}
else
{
SPI1_MOSI = 0; //若最到位为低,则输出低
}
byte <<= 1; // 低一位移位到最高位
SPI1_SCK = 0; //拉低时钟
Temp <<= 1; //数据左移
if(SPI1_MISO)
Temp++; //若从从机接收到高电平,数据自加一
SPI1_SCK = 1; //拉高时钟
}
return (Temp); //返回数据
}
CPOL=1,CPHA=1 模式
u8 SOFT_SPI_RW(u8 byte)
{
u8 i,Temp=0;
for(i=0;i<8;i++) // 循环8次
{
SPI1_SCK = 0; //拉低时钟
if(byte&0x80)
SPI1_MOSI = 1; //若最到位为高,则输出高
else
SPI1_MOSI = 0; //若最到位为低,则输出低
byte <<= 1; // 低一位移位到最高位
SPI1_SCK = 1; //拉高时钟
Temp <<= 1; //数据左移
if(SPI1_MISO)
Temp++; //若从从机接收到高电平,数据自加一
SPI1_SCK = 0; //拉低时钟
}
return (Temp); //返回数据
}