IO口模拟SPI总线问题
来源:互联网 发布:淘宝网禁止黄赌毒 编辑:程序博客网 时间:2024/06/05 18:16
请教各位老大,如下是网络上找的IO口模拟SPI总线发送接收数据的程序,已知从设备上升沿采集数据,下降沿输出数据。有几个问题不明白,用红色标出来了,请老大指点一下,谢谢!
INT8U SpiTxRxByte(INT8U dat)
{
INT8U i,temp;
temp = 0;
SCK = 0; //已知从设备上升沿采集。时钟置低,准备发送一BIT数据
for(i=0; i<8; i++)
{
if(dat & 0x80)
{
MOSI = 1; //数据已经准备好
}
else MOSI = 0;
dat <<= 1;
SCK = 1; //时钟置高,制造一个上升沿,数据打入从设备
_nop_;
_nop_;
_nop_;
_nop_;
temp <<= 1; //这里开始不明白了,怎么没有制造下降沿就读从设备的数据呢。从设备是下降沿才出数据的啊。我感觉是"temp<<1;"应该放在SCK=0之
if(MISO)temp++; //后才对
SCK = 0;
_nop_;
_nop_;
}
return temp;
}
请老大解释一下为什么这样写,谢谢了哈!
INT8U SpiTxRxByte(INT8U dat)
{
INT8U i,temp;
temp = 0;
SCK = 0; //已知从设备上升沿采集。时钟置低,准备发送一BIT数据
for(i=0; i<8; i++)
{
if(dat & 0x80)
{
MOSI = 1; //数据已经准备好
}
else MOSI = 0;
dat <<= 1;
SCK = 1; //时钟置高,制造一个上升沿,数据打入从设备
_nop_;
_nop_;
_nop_;
_nop_;
temp <<= 1; //这里开始不明白了,怎么没有制造下降沿就读从设备的数据呢。从设备是下降沿才出数据的啊。我感觉是"temp<<1;"应该放在SCK=0之
if(MISO)temp++; //后才对
SCK = 0;
_nop_;
_nop_;
}
return temp;
}
请老大解释一下为什么这样写,谢谢了哈!
时钟, 时钟, 程序, 色标
满意回复
NE5532 查看完整内容
呵呵,这么高的分哪,给我吧,我告诉你咋回事。 1.从图上看出来,CSn拉低以后,MISO的第一个BIT就已经上线了,所以说这个时序严格来说在读“上一个”下降沿送出 ...
sunhq02 查看完整内容
NE5532说的第三点是对的
airwill 查看完整内容
就是为了符合 下面那张图的时序要求呀
dqyubsh 查看完整内容
SPI有几种类型的,不一定别人的程序刚好满足你的要求。看看别人的死路,自己写一个好了。
billyliang89 查看完整内容
根据你所提供的图“SO”那一行,输出数据也是上升沿锁存,即上升沿使设备锁存MOSI的数据的同时在MISO上送出数据,懂了没? ...
sunhq02 查看完整内容
SPI的时序虽然是那样子没错 但是作为主设备,时序的控制权在主设备手里 从设备遵守的原则是,在主设备时钟前沿发出后的一定时间之内准备好数据 ,并在主设备时钟 ...
sunhq02 查看完整内容
第2点,那个数据并不是一直在线上 SPI的协议规定从设备有义务在时钟后沿维持数据一段时间,但不是一直都在 并不一定维持到时钟前沿 ...
yewuyi 查看完整内容
呵呵,这种东西如果对着时序表还看不明白,就直接打屁股10下把
amwrdfe 查看完整内容
i2c,uart,对着时序图来搞,没什么难的。
相关帖子
回复 收藏 分享 淘帖 赏
举报
338
主题1万
帖子4万
积分版主
专家等级:
结帖率:96%
打赏:0.00
受赏:58.00
就是为了符合 下面那张图的时序要求呀
回复 赏
举报
44
主题2236
帖子7012
积分高级工程师
专家等级:
结帖率:100%
SPI有几种类型的,不一定别人的程序刚好满足你的要求。看看别人的死路,自己写一个好了。
回复 赏
举报
0
主题1
帖子3
积分实习生
专家等级:
结帖率:0%
根据你所提供的图“SO”那一行,输出数据也是上升沿锁存,即上升沿使设备锁存MOSI的数据的同时在MISO上送出数据,懂了没?
回复 赏
举报
4
主题524
帖子1610
积分助理工程师
专家等级:
结帖率:100%
打赏:0.00
受赏:18.00
SPI的时序虽然是那样子没错
但是作为主设备,时序的控制权在主设备手里
从设备遵守的原则是,在主设备时钟前沿发出后的一定时间之内准备好数据
,并在主设备时钟后沿发出后一定时间之内保持数据
,也就是说,主设备时钟后沿前后的这段时间里面,读从设备数据,都是安全的
,前一个指令或者后一个指令并没有关系
但是作为主设备,时序的控制权在主设备手里
从设备遵守的原则是,在主设备时钟前沿发出后的一定时间之内准备好数据
,并在主设备时钟后沿发出后一定时间之内保持数据
,也就是说,主设备时钟后沿前后的这段时间里面,读从设备数据,都是安全的
,前一个指令或者后一个指令并没有关系
回复 赏
举报
159
主题1万
帖子5万
积分版主
专家等级:
结帖率:97%
打赏:0.00
受赏:38.00
呵呵,这么高的分哪,给我吧,我告诉你咋回事。
1.从图上看出来,CSn拉低以后,MISO的第一个BIT就已经上线了,所以说这个时序严格来说在读“上一个”下降沿送出的数据。
2.既然数据时在下降沿上线,那么没有发生“这一个”下降沿之前,上一个数据一直在线上。所以只要在上升沿之前读数都可以。
3.不知道这个程序用的啥单片机,多高频率,但是写程序的这个人明显没搞过汇编,最后两个NOP根本不需要,“return temp;”编译出来,加上下一次的调用语句,绝对不止4条汇编语句。而且很少见到什么单片机端口速度能超过SPI的(主频几十M的哪种除外)
1.从图上看出来,CSn拉低以后,MISO的第一个BIT就已经上线了,所以说这个时序严格来说在读“上一个”下降沿送出的数据。
2.既然数据时在下降沿上线,那么没有发生“这一个”下降沿之前,上一个数据一直在线上。所以只要在上升沿之前读数都可以。
3.不知道这个程序用的啥单片机,多高频率,但是写程序的这个人明显没搞过汇编,最后两个NOP根本不需要,“return temp;”编译出来,加上下一次的调用语句,绝对不止4条汇编语句。而且很少见到什么单片机端口速度能超过SPI的(主频几十M的哪种除外)
回复 赏
举报
4
主题524
帖子1610
积分助理工程师
专家等级:
结帖率:100%
打赏:0.00
受赏:18.00
NE5532说的第三点是对的
回复 赏
举报
4
主题524
帖子1610
积分助理工程师
专家等级:
结帖率:100%
打赏:0.00
受赏:18.00
第2点,那个数据并不是一直在线上
SPI的协议规定从设备有义务在时钟后沿维持数据一段时间,但不是一直都在
并不一定维持到时钟前沿
SPI的协议规定从设备有义务在时钟后沿维持数据一段时间,但不是一直都在
并不一定维持到时钟前沿
回复 赏
举报
1408
主题1万
帖子7万
积分版主
专家等级:
结帖率:59%
呵呵,这种东西如果对着时序表还看不明白,就直接打屁股10下把
回复 赏
举报
30
主题730
帖子2377
积分初级工程师
专家等级:
结帖率:33%
打赏:8.88
受赏:0.00
i2c,uart,对着时序图来搞,没什么难的。
回复 赏
举报
0
主题1
帖子3
积分实习生
专家等级:
结帖率:0%
学习了 正在学习中~
回复 赏
举报
0
主题255
帖子775
积分高级技术员
专家等级:
结帖率:50%
最好做个通用的,定义一个数据结构吧!上升沿还是下降沿有效可设置;
附图上的所有时间间隔可设置。
:lol
附图上的所有时间间隔可设置。
:lol
回复 赏
举报
0
主题6
帖子18
积分实习生
专家等级:
结帖率:0%
人家写的这个程序其实没什么问题的,tem<<1将最低位报持为0,如果放在SCK=0之后的话,就少了一个位了。
阅读全文
0 0
- IO口模拟SPI总线问题
- IO口模拟SPI总线
- IO口模拟SPI
- IO口模拟SPI
- RFID相关——普通IO口模拟SPI总线的实现:
- 关于IO口模拟SPI
- 关于IO口模拟SPI
- C51用IO口模拟SPI
- ZigBee 用IO口模拟SPI驱动程序
- IO 模拟 SPI协议
- spi驱动--IO模拟
- IO模拟SPI接口程序
- stm32 io模拟spi通信
- 普通IO模拟i2c总线
- AVR(Mega8)的 IO口模拟SPI,读写FLASH
- 单片机IO口模拟SPI四种模式的程序
- 普通IO口模拟实现SPI通信及应用解析
- io口spi模拟主从机通讯例程
- Java8函数式编程之三:函数式接口
- 用R进行文本挖掘与分析--软件分词统计词频
- 【模板】二叉搜索树
- git的传输协议及各自优缺点(本地传输协议,ssh,http,git)
- hessian原理分析(二)
- IO口模拟SPI总线问题
- 求利息与本金的和
- HashMap 数据结构 实现原理
- java基础(集合List-ArrayList、LinkedList、Vector的区别)
- Linux命令行六大技巧
- 三周第三次课 2017.11.01 su命令、sudo命令、限制root远程登录
- 扒新闻
- 适合Python初学者的笔记总结【干货】
- 堆排序合并几个已经排序好的链表