天天看点

基于DSP28035的模拟SPI

基于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 ++;
    }
}
若知后事如何,且看后续更新
           

继续阅读