用GPIO模拟SPI通信的一个小而关键的问题

cjsyou 2011-11-26 04:35:32
也有可能是一个愚蠢的问题

省略基本前提条件,都是通用的一般的,希望有经验的前辈给予指点。

问题的主体就是 如何用代码来表达实现SPI协议里所说的在下降沿发送数据、上升沿采样数据
有两种方式我现在不知道应该采用哪一种才是对的:
1,先后依次操作(设置电平)gpio_clk和gpio_mosi;
2,同时操作gpio_clk和gpio_mosi(所有的gpio口在硬件上连接着一个寄存器,gpio与寄存器的为一一对应着,向这个寄存器写入一个数据,这个数据中对应gpio_clk和gpio_mosi的位已设置好相应的值,这样就实现了同时操作gpio_clk和gpio_mosi)

我一边写一边在想,又看了一遍协议,忽然发现好像问题是这样的:一个CLK周期里包含两个动作——输出和采样,但是这两个动作是不一样的,采样的时刻CLK发生跳变但数据线是稳定的,而输出的时刻二者同时发生跳变。对采样的情形我理解,这样的话代码应采用上述1方式编写,对输出的情形也基本理解,这样的话对应的代码应采用上述2方式编写,这样的话总的来看在一个CLK周期里应该将输出和采样分别采用不同的方式编写代码。但是我对输出的情形有一点不太理解的是我觉得那样是可以的但不知道是不是必须的,我觉得应该不是必须的。这些都是猜测想象,不知道是不是对的,请高手前辈指点。
我在做基于博通的BSP开发,不是单片机,不知道这有没有关系
...全文
966 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanatana 2012-05-28
  • 打赏
  • 举报
回复
楼主,你的这个模拟spi的程序代码还有么?发给我一份吧,qq453793591
cjsyou 2011-11-30
  • 打赏
  • 举报
回复
1楼的回复对我没有用处,2楼没有针对我的问题回复,3楼的skylkj的回复的是正确的,其实就是“输出是为采样服务”,“只要保证在上面的采样方式下能获得正确的数据就可以了”,所以两种方式都可以,我已经实验证实了
codesnail 2011-11-28
  • 打赏
  • 举报
回复
同时的意思是延时相差在可容忍的范围即可。

可能是我的语文没学好,没看懂lz想表达的意思。

另:个人非常地不建议用gpio模拟各种协议,这种需求的真正存在应该是极少见的。(例如改造现有项目,加功能等。)一般地如果是新项目的话,如果要用模拟各种协议则说明mcu选型有问题。模拟协议的可靠性较差。

飞天舞 2011-11-28
  • 打赏
  • 举报
回复
SPI有三线或四线的。
如三线的。
一个IO引脚为CS,一个IO引脚为CLK,一个引脚为DATA。
输出数据时。
gpio_cs(1)

gpio_clk(1)//或gpio_clk(0)看是要上下降沿或上升沿采样数据
gpio_data_set(value)//gpio_data_get(value)
gpio_clk(0)//或gpio_clk(1)//完成一位数据的发送或读取。
...
...//发送若干位数据

gpio_cs(0)//结束通信


以上就是一个模拟的操作过程
skylkj 2011-11-28
  • 打赏
  • 举报
回复
其实过程原理理解就好了

采样:clk检测到跳变,就可以去取data数据了

输出是为采样服务的,换句话说,我只要保证在上面的采样方式下能获得正确的数据就可以了。

所以实际上,输出的时候,你完全可以先放data上去,到data输出稳定了,再操作clk。没有什么规定输出的时候“必须”“同时”操作的,楼主你自己想多了而已。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧