×
单片机 > 单片机程序设计 > 详情

模拟SPI实现和调试流程

发布时间:2020-05-29 发布时间:
|

一般来说,所有的spi通信设备都可以使用模拟spi来实现,而且模拟spi的好处就是不需要针对每一款mcu去重新熟悉其spi控制器的配置,只要简单配置一下spi_clk、spi_cs、spi_mosi、spi_miso四个引脚的输入输出即可,具有很好的可移植性。


下面我以stm32为例,简单讲解一下模拟spi的实现和调试流程,实例中spi以上升沿来进行收发数据


1、首先先贴出代码


    //初始化spi_clk、spi_cs、spi_mosi、spi_miso四个io

    //spi_cs

    GPIO_Initure.Pin=SIMULATE_SPI_CS_PIN; //PC10

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速

    HAL_GPIO_Init(GPIOC,&GPIO_Initure);     //初始化


    //spi_clk

     GPIO_Initure.Pin=SIMULATE_SPI_CLK_PIN; //PC11 

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速

    HAL_GPIO_Init(GPIOC,&GPIO_Initure);     //初始化


    //spi_miso 

    GPIO_Initure.Pin=SIMULATE_SPI_MISO_PIN; //PC112

    GPIO_Initure.Mode=GPIO_MODE_INPUT;  

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速

    HAL_GPIO_Init(GPIOC,&GPIO_Initure);     //初始化


    //spi_mosi

    GPIO_Initure.Pin=SIMULATE_SPI_MOSI_PIN; //PC113

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速

    HAL_GPIO_Init(GPIOC,&GPIO_Initure);     //初始化 


void simulate_spi_write_byte(u8 data)

{

    u8 kk;


    SIMULATE_SPI_CS = 0;


    SIMULATE_SPI_CLK = 0;

    SIMULATE_DELAY_US;     //读取第一bit数据 等待数据稳定 根据实际时钟调整


    //大概的spi时钟为1/2us=500KHZ   左右

    for(kk=0;kk<8;kk++)

    {

     //高位在前发送方式    根据升级器件特性定

    if((data&0x80)==0x80) SIMULATE_SPI_MOSI = 1;

    else         SIMULATE_SPI__MOSI = 0;

    SIMULATE_DELAY_US;      //等待数据稳定  根据实际时钟调整

    SIMULATE_SPI_CLK = 1;//上升沿发送数据

    SIMULATE_DELAY_US;//CLK高电平保持一段时间 这个可以不需要 根据具体的spi时钟来确定

    SIMULATE_SPI_CLK = 0; //把时钟拉低实现为下一次上升沿发送数据做准备

    data = data<<1;//发送数据的位向前移动一位

    }


    SIMULATE_SPI_CS = 1;

}


u8 simulate_spi_read_byte(void)

{

    u8 kk=0, ret=0;


    SIMULATE_SPI_CS = 0;


    SIMULATE_SPI_CLK = 0;

    SIMULATE_DELAY_US;//读取第一bit数据 等待数据稳定 根据实际时钟调整


    //大概的spi时钟为1/2us=500KHZ   左右

    for(kk=0;kk<8;kk++)

    {

    ret = ret<<1; //读的时候 高位在前   根据升级器件特性定

    SIMULATE_SPI_CLK = 1; //上升沿读取数据

    if(SIMULATE_MISO) ret |= 0x01;

    SIMULATE_DELAY_US;//根据实际时钟调整,可以不添加

    SIMULATE_SPI_CLK = 0;//标识数据接收完毕

    SIMULATE_DELAY_US; //等待数据稳定  根据实际时钟调整

    }


    SIMULATE_SPI_CS = 1;


    return ret;

}

2、SPI调试的注意点 

1)spi读取和发送数据前,等待数据稳定的延时是有必要添加的,否则,存在时钟在跳变的同时,数据也在跳变的情况,这个时候读回来的数据有可能不准确,可能是0或1。


2)根据器件的特性说明,设置读取的方式,高位在前还是低位在前,当然有些器件会在读取或者写入数据的时候,有些特殊的时序要求,这个就另作说法了,如SSD2828器件。


3)spi是否能够正常读写器件,最好的判断方法就是读取器件的id,可以循环去读取,测试是否能够正确返回id,如果不行则需结合示波器查看波形。


4)spi器件的复位管脚也非常重要,如果复位脚一直处于复位的状态,那么这个时候也是无法正确读写器件的



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机语音识别电路模块设计