模拟SPI实现和调试流程

来源:互联网 发布:简单bbs论坛源码php 编辑:程序博客网 时间:2024/06/07 02:40
一般来说,所有的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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

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

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

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

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

原创粉丝点击