文档章节

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

s
 sflfqx
发布于 2014/07/25 17:45
字数 543
阅读 7028
收藏 8
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的模拟读写。

本文转载自:http://book.51cto.com/art/201304/390512.htm

s
粉丝 42
博文 202
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中

评论(1)

无关风月887671
无关风月887671
你模拟的不是模式1
SPI协议概括

一 SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟...

曾永刚
2012/08/08
0
0
嵌入式linux系统的开发——SPI Bit-banging方法的实现

前言 SPI(Serial Peripheral Interface)是一种应用广泛的通信总线,通常微处理器上会集成SPI模块以支持该通信协议,输出正确的信号的时序,并保证时序间同步,实现与外部SPI设备正常通信。...

元宵大师
2018/06/07
0
0
​Beaglebone Black教程Beaglebone Black的引脚分配

Beaglebone Black教程Beaglebone Black的引脚分配 Beaglebone Black的引脚分配 绝大多数的微型开发平台都提供了一些称为GPIO的输入输出端口。这些端口可以让你使用软件和硬件来控制一些电子的...

大学霸
2016/03/28
730
0
设备树之I2C和SPI实例

I2C实例 clock-frequency i2c总线频率,常用值有100000,400000 #address-cells 该属性值必须为1 #size-cells 该属性值必须为0 具体实例如下图所示: 上图1描述i2c控制器属性,比如寄存器属性...

lusimquan
2018/02/02
0
0
io口模拟spi,stm32f103与MS5611基于spi总线的温度压力高度数据读取

以下文件为源文件 /** -----------------------MS5611驱动 && IO口模拟SPI驱动------------------------- / / 包含的头文件 ------------------------------------------------------------......

jjadads
2018/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部