基于DSP28035的模拟SPI
————你真的理解SPI通信吗?
你真的理解SPI是怎么通信的吗?SPI通信时,什么时候发送数据?什么时候数据采样?我们在做模拟SPI时怎么体现出SPI的四种工作模式?
何时收发数据?
第一,作为主机,SPI在建立起通信什么时刻发送数据呢?什么时刻进行数据采样?
抛出俩个新的名词:时钟极性(CPOL)和时钟相位(CPOA)。
CPOL:决定SCLK时钟信号在空闲时的状态
0:空闲状态时,SCLK保持低电平
1:空闲状态时,SCLK保持低电平
CPOA:决定数据是在上升沿还是下降沿采样
0:第一个时钟沿开始数据采样
1:第二个时钟沿进行数据采样
看到这里如果还不明白,就请继续向下看:
当CPOL = 0 , CPOA = 0时,即MODE = 0;空闲时,SCLK为低电平,第一个时钟沿数据采样,也就是在上升沿时进行数据采样,下降沿时数据发送,即第二个边沿
当CPOL = 0 , CPOA = 1时,即MODE = 1;空闲时,SCLK为低电平,第二个时钟沿数据采样,也就是在下降沿时进行数据采样;上升沿时数据发送,即第一个边沿
当CPOL = 1 , CPOA = 0时,即MODE = 2;空闲时,SCLK为高电平,第一个时钟沿数据采样,也就是在上升沿时进行数据采样,下降沿时数据发送,即第二个边沿
当CPOL = 1 , CPOA = 1时,即MODE = 3;空闲时,SCLK为低电平,第二个时钟沿数据采样,也就是在下降沿时进行数据采样;上升沿时数据发送,即第一个边沿
注:可对着SPI的时序图,对上面的文字描述进行分析
你还有不明白吗?如果没明白,接着往下,以模拟SPI具体实例来看:
模拟SPI
上面问题如果你已经明白的话,那么四种SPI的工作方式如何体现也就自然明白了。我们常用的SPI方式是MODE0和MODE3。下面我们来具体实现模拟SPI:
//本文可对多种单片机进行测试
void GPIO_Init()
{
//对引脚进行初始化定义
//sclk
//MOSI
//MISO
//CS选用
}
//本文决定收发数据是16位的数据
void SPI_WRITE_READ(uint16 wdata, uint16 *rdata)
{
//MODE0
SCLK = 0;//空闲状态,sclk = 0
DELAY_US();//可将时间调大,调试成功后,再适当的修改时间
for(i = 0;i < 16; i++)
{
if(wdata&0x80) MOSI = 1;
else MOSI = 0;
wdata << 1;
SCLK = 1;
DELAY_US();
// if(MISO) rdata = 0x80 << i;//可进行循环移位
rdata <<= 1;//经测试有些不能进行循环移位可用
if(MISO) rdata ++;
SCLK = 0;
DELAY_US();
}
}
void SPI_WRITE_READ_MODE1()
{
//MODE1
SCLK = 0;//空闲时,SCLK = 0
DELAY_US();
for(i = 0;i < 16; i++)
{
SCLK = 1;
DEALY_US();
if(wdata & 0x80) MOSI = 1;
else MOSI =0;
wdata << 1;
SCLK = 0;
DEALY_US();
// if(MISO) rdata = 0x80 << i;//可进行循环移位
rdata <<= 1;//经测试有些不能进行循环移位可用
if(MISO) rdata ++;
}
}
若知后事如何,且看后续更新