使用GPIO模拟SPI总线进行通信

下面给出了模拟SPI总线在模式1下进行读写的伪代码,用以说明如何使用GPIO实现SPI通信:

    #define SS      252                     //定义SS所对应的GPIO接口编号  
    #define SCLK    253                     //定义SCLK所对应的GPIO接口编号  
    #define MOSI    254                     //定义SCLK所对应的GPIO接口编号  
    #define MISO    255                     //定义MISO所对应的GPIO接口编号  
    #define OUTP    1                       //表示GPIO接口方向为输出  
    #define INP 0                           //表示GPIO接口方向为输入  
    /* SPI端口初始化 */  
    void spi_init()  
    {  
    set_gpio_direction(SS, OUTP);  
    set_gpio_direction(SCLK, OUTP);  
    set_gpio_direction(MOSI, OUTP);  
    set_gpio_direction(MISO, INP);  
    set_gpio_value(SCLK, 0);                    //CPOL=0 
    set_gpio_value(MOSI, 0);  
    }  
    /*  
    从设备使能  
    enable:为1时,使能信号有效,SS低电平  
    为0时,使能信号无效,SS高电平  
    */  
    void ss_enable(int enable)  
    {  
    if (enable)  
    set_gpio_value(SS, 0);                  //SS低电平,从设备使能有效  
    else  
    set_gpio_value(SS, 1);                  //SS高电平,从设备使能无效  
    }  
        /* SPI字节写 */  
    void spi_write_byte(unsigned char b)  
    {  
    int i;  
    for (i=7; i>=0; i--) {  
    set_gpio_value(SCLK, 0);  
    set_gpio_value(MOSI, b&(1<<i));         //从高位7到低位0进行串行写入  
    delay();                            //延时  
    set_gpio_value(SCLK, 1);                // CPHA=1,在时钟的第一个跳变沿采样  
    delay();      
    }  
    }  
    /* SPI字节读 */  
    unsigned char spi_read_byte()  
    {  
        int i;  
        unsigned char r = 0;  
        for (i=0; i<8; i++) {  
            set_gpio_value(SCLK, 0);  
            delay();                            //延时  
    set_gpio_value(SCLK, 1);                // CPHA=1,在时钟的第一个跳变沿采样  
    r = (r <<1) | get_gpio_value(MISO);         //从高位7到低位0进行串行读出  
    delay();  
        }  
    }  
    /*  
        SPI写操作  
        buf:写缓冲区  
        len:写入字节的长度  
    */  
    void spi_write (unsigned char* buf, int len)  
    {  
    int i;  
    spi_init();                         //初始化GPIO接口  
    ss_enable(1);                           //从设备使能有效,通信开始  
    delay();                                //延时  
    //写入数据  
    for (i=0; i<len; i++)  
    spi_write_byte(buf[i]);  
    delay();  
    ss_enable(0);                           //从设备使能无效,通信结束  
    }  
    /*  
    SPI读操作  
    buf:读缓冲区  
    len:读入字节的长度  
    */  
    void spi_read(unsigned char* buf, int len)  
    {  
    int i;  
    spi_init();                         //初始化GPIO接口  
    ss_enable(1);                           //从设备使能有效,通信开始  
    delay();                                //延时  
    //读入数据  
    for (i=0; i<len; i++)  
    buf[i] = spi_read_byte();  
    delay();  
    ss_enable(0);                           //从设备使能无效,通信结束  
    }

在上面的代码中,spi_read和spi_write这两个函数可以实现GPIO对SPI的模拟读写。

使用GPIO模拟SPI总线进行通信

时间: 2024-10-09 13:57:44

使用GPIO模拟SPI总线进行通信的相关文章

GPIO模拟SPI

上次用gpio模拟i2c理解i2c协议,同样的,我用gpio模拟spi来理解spi协议. 我用的是4线spi,四线分别是片选.时钟.命令/数据.数据. 数据在时钟上升沿传递,数据表示的是数据还是命令由命令/数据线决定. 开始条件: void spi_start(void) { gpio_config(GPIO_CS, GPIO_OUTPUT); udelay(SPI_SPEED_DURATION); gpio_set(GPIO_CS, 0);/* start condition */ udela

SPI总线协议分析

一.概述 SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信. SPI 主要应用在 EEPROM, Flash, 实时时钟(R

【转载】GPIO模拟i2c通信

I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主机需要发起新的通信请求,那么需要首先通过SDA和SCL发出起始标志.当SCL为高电平时,SDA电平从高变低,这一变化表示完成了通信的起始条件. 在起始条件和数据通信之间,通常会有延时要求,具体的指标会在设备厂商的规格说明书中给出. 2. 数据传输阶段 I2C总线的数据通信是以字节(8位)作为基本单位

cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)

SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola首先在其 MC68HCXX 系列处理器上定义的. SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数字信号解码器之间. SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信

单片机模拟 IIC 总线与 EEPROM(AT24C02)通信

数据有效性: 起始和终止信号时序: 设备地址: 写字节时序: 读数据时序: 函数模拟 IIC 总线 时序: /**************************************/ /******模拟I2C总线操作函数*************/ /**************************************/ //延时函数 void Delay() { ; ; } //初始化 void I2C_Init() { SDA = 1; SCL = 1; } //起始信号 vo

linux enc28j60网卡驱动移植(硬件spi和模拟spi)

本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是就着手移植enc28j60的驱动. 其实移植enc28j60的驱动也十分简单,网上有现成的,只需要分配一些硬件资源即可. 由于我的内核版本老到掉牙,没有自带enc28j60的驱动,只能在网上找一个: enc28j60.c http://git.ti.com/ti-linux-kernel/ti-li

S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看发板,读写都行:通过增加一些调试信息,对linux i2c驱动其中的编写方法之一有了一定了解,在我的另外一篇博文有详细说明.但同时对在linux下GPIO模拟i2c产生了兴趣,于是就写这篇博文来记录驱动编写过程中遇到的问题.如果想了解了i2c时序,请google或百度一下. 本篇博文通过misc驱动

I2C和SPI总线对比【转】

转自:http://blog.csdn.net/skyflying2012/article/details/8237881/ 最近2周一直在调试IIC和SPI总线设备,这里记录一下2种总线,以备后忘. 一 IIC总线 I2C--INTER-IC串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线.它以1根串行数据线(SDA)和1根串行时钟线(SCL)实 现了双工的同步数据传输.具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点.在主从通信中,可以有多个I2C总线器件同时接到I

SPI总线小结

串行外设接口(Serial Peripheral Interface,SPI)的缩写.是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线.Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间. SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时).也是所有基于SPI的设备共有的,它们是