关闭

模拟SPI实现和调试流程

标签: 模拟spi
4479人阅读 评论(0) 收藏 举报
分类:
一般来说,所有的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器件的复位管脚也非常重要,如果复位脚一直处于复位的状态,那么这个时候也是无法正确读写器件的

2
0
查看评论

GPIO口模拟SPI - 驱动W25Qxx

废话少说,直接上代码: DataFlash_reg.h:/* Using SPIO simulator PB8 -- spi cs PA9 -- spi clock PA10 -- spi MOSI PB7 -- spi MISO PA8 -- hold PC4 -- Write pro...
  • EFM32
  • EFM32
  • 2016-01-11 22:26
  • 4052

STM32 软件模拟SPI时序驱动NRF24L01

其实stm32本身的硬件SPI也很好用,但是还是想用软件来模拟一下PSI的时序。 SPI 是一种高速的,全双工,同步串行的通信总线。SPI通信方式相当于是一个环形结构,由CSN、MISO、MOSI、SCLK四线组成,主要是在SCLK时钟线的驱动下,进行数据转换。 接下来直接上程序配置: ...
  • xiaolz88
  • xiaolz88
  • 2017-07-11 10:07
  • 918

STM32F103VET6 2.4G通信模块NRF24L01 GPIO模拟SPI的测试例程

自己画的一块开发测试板,有一个NRF24L01+的通信接口,之前买了一些NRF24L01+的模块,比较便宜,做过NRF905的通信,NRF24L01的也是有些相似。网上教程一大堆,我找了个GPIO 模拟SPI通信的例程,改了下,开始出了点问题,后来找到并解决,通信正常了。 先说一下问题: NRF...
  • tcjy1000
  • tcjy1000
  • 2017-04-17 15:59
  • 2218

STM32模拟SPI接口

做单片机开发的时候经常需要用到模拟spi接口,这种写法不错的,网上很多类似的,我也拿来主义了。 #define MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_10) #define MOSI_L GPIO_ResetBits(GPIOB, GPIO_Pin_10) #de...
  • penglijiang
  • penglijiang
  • 2014-01-18 11:53
  • 11867

STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

Ⅰ、写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。硬件上由CS、SCK、MISO、MOSI四根通信线连接而成。关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机、W25Q16为从机进行SPI通信实验。 ...
  • ybhuangfugui
  • ybhuangfugui
  • 2016-07-29 21:31
  • 7665

单片机软件模拟SPI接口—加深理解SPI总线协议

单片机软件模拟SPI接口—加深理解SPI总线协议           SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外围扩展芯片之间的串行连接,现已发...
  • ce123
  • ce123
  • 2011-11-01 00:01
  • 44490

单片机IO口模拟SPI四种模式的程序

/IO端口定义 #define SPI_SCK  PC0 #define SPI_MOSI PC1 #define SPI_MISO PC2 #define SPI_DDR  DDRC #define...
  • zyboy2000
  • zyboy2000
  • 2013-09-21 10:00
  • 18191

软件模拟SPI程序(测试过的)

  • 2010-03-12 17:44
  • 6KB
  • 下载

关于 STM32 SPI 从机模式的问题

你再寻找 关于SPI 作为从机时  而且还没有NSS 信号    而出现数据接收错误的烦恼吧 最近给客户做一个项目 使用到了SPI 从机     在网上找答案  但是没有找到自己满意的  现在来说  都没有 将SPI ...
  • rrxxzz
  • rrxxzz
  • 2016-07-06 17:34
  • 3284

STM32F103控制AD7606采集模拟信号

1、配置STM32F103的SPI口 void AD7606_Port_Init(void) { GPIO_InitTypeDef  GPIO_InitStructure; SPI_InitTypeDef   SPI_InitStructure; RCC_APB2Per...
  • jlp11260
  • jlp11260
  • 2016-06-20 22:09
  • 3719
    个人资料
    • 访问:23104次
    • 积分:466
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论