什么情况要用gpio spi模拟spi

使用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&&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&&i++)&&
&&&&buf[i]&=&spi_read_byte();&&
&&&&delay();&&
&&&&ss_enable(0);&&&&&&&&&&&&&&&&&&&&&&&&&&&//从设备使能无效,通信结束&&
在上面的代码中,spi_read和spi_write这两个函数可以实现GPIO对SPI的模拟读写。
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 62, 距离下一级还需 138 积分
论坛徽章:0
紧急求助,gpio口模拟spi读数据的问题,写数据都没问题了,读00h的数据输出的都是1,不知道怎么回事
gpio定义和spi的都不说了,写寄存器没有问题,读寄存器到底怎么回事呢?请大虾帮忙看看
/*这是写寄存器的代码段*/
static void gpio_lcd_emuspi_write_one_para(unsigned short addr, unsigned short para)
& && &&&i = addr | 0x700000;
& && &&&gpio_direction_output(spi_cs, 0);
& && &&&/*udelay(4);*/
& && &&&for (j = 0; j & 24; j++) {
& && && && && & if (i & 0x800000)
& && && && && && && && &gpio_direction_output(spi_sdo, 1);& && &&&
& && && && && & else
& && && && && && && && &gpio_direction_output(spi_sdo, 0);& && &&&
& && && && && & gpio_direction_output(spi_sclk, 0);& && &&&
& && && && && & /*udelay(4);*/
& && && && && & gpio_direction_output(spi_sclk, 1);& && &&&
& && && && && & /*udelay(4);*/
& && && && && & i &&= 1;
& && &&&gpio_direction_output(spi_cs, 1);
& && &&&/*udelay(4);*/
& && &&&i = para | 0x720000;
& && &&&gpio_direction_output(spi_cs, 0);
& && &&&/*udelay(4);*/
& && &&&for (j = 0; j & 24; j++) {
& && && && && & if (i & 0x800000)
& && && && && && && && &gpio_direction_output(spi_sdo, 1);
& && && && && & else
& && && && && && && && &gpio_direction_output(spi_sdo, 0);
& && && && && & gpio_direction_output(spi_sclk, 0);& && &&&
& && && && && & /*udelay(4);*/
& && && && && & gpio_direction_output(spi_sclk, 1);
& && && && && & /*udelay(4);*/
& && && && && & i &&= 1;
& && &&&gpio_direction_output(spi_cs, 1);
/*这是读寄存器的代码段*/
static void gpio_lcd_emuspi_read_one_para(unsigned short addr, uint32 *data)
& && &&&int j,
& && &&&uint32 dbit,
& && &&&i = addr | 0x700000;
& && &&&gpio_direction_output(spi_cs, 0);
& && &&&/*udelay(4);*/
& && &&&for (j = 0; j & 24; j++) {
& && && && && & if (i & 0x800000)
& && && && && && && && &gpio_direction_output(spi_sdo, 1);& && &&&
& && && && && & else
& && && && && && && && &gpio_direction_output(spi_sdo, 0);& && &&&
& && && && && & gpio_direction_output(spi_sclk, 0);& && &&&
& && && && && & /*udelay(4);*/
& && && && && & gpio_direction_output(spi_sclk, 1);& && &&&
& && && && && & /*udelay(4);*/
& && && && && & i &&= 1;
& && &&&gpio_direction_output(spi_cs, 1);
& && &&&/*udelay(4);*/
& && &&&ret = gpio_direction_input(spi_sdo);
& && &&&gpio_direction_output(spi_cs, 0);
& && &&&//udelay(40);
& && &&&bits=0;
& && &&&for (j = 0; j & 8; j++) {
& && && && && & bits&&= 1;
& && && && && & gpio_direction_output(spi_sclk, 1);
& && && && && & gpio_direction_output(spi_sclk, 0);
& && && && && & udelay(10);
& && && && && & dbit=gpio_get_value(spi_sdo);
& && && && && & //udelay(45);
& && && && && &
& && && && && & //bits = 2*bits+
& && && && && & bits|=
& && && && && &
& && &&&*data =
& && &&&gpio_direction_output(spi_cs, 1);
datesheet中是在sclk的上升沿读spi的数据的,是不是读程序哪里出问题了?请高手帮忙
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 62, 距离下一级还需 138 积分
论坛徽章:0
顶起,求助各位大侠了
稍有积蓄, 积分 347, 距离下一级还需 153 积分
论坛徽章:0
回复 #2 lixw668 的帖子
帖子太长了。。。
白手起家, 积分 62, 距离下一级还需 138 积分
论坛徽章:0
没人来自己顶起,hoho!~~~
应该是spi输出没设置对或者功能没打开。。。。有人没? 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
用GPIO模拟SPI协议 的实现
下载积分:700
内容提示:用GPIO模拟SPI协议 的实现GPIO,SPI,spi,gpio
文档格式:PDF|
浏览次数:73|
上传日期: 22:51:00|
文档星级:
该用户还上传了这些文档
用GPIO模拟SPI协议 的实现
官方公共微信linux下GPIO模拟SPI
[问题点数:40分]
linux下GPIO模拟SPI
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。您所在的位置: &
使用GPIO模拟SPI总线进行通信
使用GPIO模拟SPI总线进行通信
章亦葵/李幼萌
清华大学出版社
《Intel凌动平台嵌入式应用与实践》第4章Linux系统软硬件开发,本章将介绍LAB8903实验箱在Linux环境下的外设驱动程序及应用程序的开发方法。本节为大家介绍使用GPIO模拟SPI总线进行通信。
4.3.6& 使用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));&&&&&&&&&//从高位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;&i++)&{ &&&&&&&&&set_gpio_value(SCLK,&0); &&&&&&&&&delay();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//延时 &set_gpio_value(SCLK,&1);&&&&&&&&&&&&&&&&//&CPHA=1,在时钟的第一个跳变沿采样 &r&=&(r&)&|&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;&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;&i++) &buf[i]&=&spi_read_byte(); &delay(); &ss_enable(0);&&&&&&&&&&&&&&&&&&&&&&&&&&&//从设备使能无效,通信结束 &} &
在上面的代码中,spi_read和spi_write这两个函数可以实现GPIO对SPI的模拟读写。
&【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
本书全面讲解WPF的实际工作原理,是一本WPF权威著作。在紧贴实用
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
本书是一本系统讲解Android应用开发安全的书籍。它首
产品经理发展到一定阶段,再要成长,光靠学习一些知识
本教材以面向应用型人才培养为目标;以非传统的组织结
本书并不是关于Web服务的又一本开发手册,抑或是开发技术的宝典之类的读物。本书的作者来自于IBM软件开发中心的SOA技术中心,作
51CTO旗下网站}

我要回帖

更多关于 gpio模拟spi 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信