您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 请教两个BF533的SPI通信问题
本帖共有1238个阅读者
发表帖子 发表投票 回复主题
请教两个BF533的SPI通信问题
wuhuio(论坛新手)
wuhuio
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:204
积分:14
注册时间:2013/5/30
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
请教两个BF533的SPI通信问题
各位前辈,现在遇到这种情况,一个BF533运行uClinux,作为SPI的master;另外一个BF533作为从机。
对于从机发送数据,主机uClinux接收数据的情况,请问主机的SPI驱动怎么知道何时指定片选从机?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/14 22:23:51
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPI 的时钟是主机发起的,如果是两个处理器,你需要用IO加一个握手信号,;当你从机需要发送数据时,将IO拉低,然后将要传输的数据送入SPI传输FIFO。主机感知IO拉低,向从机发送数据0或者0xff,这样SPICLK会产生时钟,SPI从机FIFO中的数据会自动传输给主机。然后从机查询到传输FIFO为空,若还需要发送数据,将新的数据继续填入FIFO,握手IO仍保持低。
主机只要感知到IO为低,就发时钟读取数据,直到IO为高。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/15 9:49:31
wuhuio(论坛新手)
wuhuio
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:204
积分:14
注册时间:2013/5/30
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢 andy,SPI传输FIFO的容量是固定的吗,可以调整吗?

请问如果使用uClinux的SPI Master驱动中如下的 bfin_spi_u8_reader函数接收从机(无操作系统的裸机程序)数据,此时还需要额外加一个握手信号吗?
static void bfin_spi_u8_reader(struct driver_data *drv_data)
{
u16 tx_val = drv_data->cur_chip->idle_tx_val;
/* discard old RX data and clear RXS */
bfin_spi_dummy_read(drv_data);
while (drv_data->rx < drv_data->rx_end) {
write_TDBR(drv_data, tx_val);
while (!(read_STAT(drv_data) & BIT_STAT_RXS))
cpu_relax();
*(u8 *) (drv_data->rx++) = read_RDBR(drv_data);
}
}

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/15 18:53:33
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
FIFO大小固定的,最大是16bit,没办法更改。
需不需要握手,是和你定制的协议有关的,看你设备的主动性。你也可以每次通过命令来访问设备,就不需要握手了。如你制定一些固定的命令字查询,从机接收到命令字后,才会做出相应的反应,被动式操作,就像操作SPI Flash一样。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/15 19:08:38
wuhuio(论坛新手)
wuhuio
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:204
积分:14
注册时间:2013/5/30
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
请问主机片选和提供时钟的时间之间有什么关系?

主机片选从机一段较长的时间,如果在这段时间内的某一时刻从机向主机发送数据,主机那边的MISO能否随时读到相应数据?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/15 19:28:55
wuhuio(论坛新手)
wuhuio
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:204
积分:14
注册时间:2013/5/30
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
从机接收到主机命令字后,如果接下来从机要发送大量数据,怎么保证主机提供的时钟和片选一直继续有效,当然片选或许可以手工维持低电平,想不清楚时钟是怎么保持的?请andy指导,谢谢!

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/15 19:37:25
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
插播:广而告之

OpenADSP开源社区提供ADI DSP的芯片、开发板、仿真器现货供应,并提供优质售后服务,有需要可联系OP,QQ:5516164,加好友注明来自开源社区。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/4/15 20:12:56
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

长时间置低片选,是否能读到数据,和设备有关,看你的设备有没有超时机制,如果没有,就可以读到数据。
时钟是主机发起的。
SPI有两种片选模式,一种自动片选模式。参考我们的SD卡程序,这种模式每次发送数据,片选会置低,数据传输结束,片选会自动拉高。
一种是手动片选模式,参考我们的触摸屏程序。
当你的设备需要传输数据时,一种是通过协议方式,主机询问设备要传输多少数据,然后主机不断发送0数据产生时钟,然后读取设备数据。一种是握手方式,只要主机检测到握手信号没有结束,就不断发送0产生时钟读取设备数据。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/17 1:11:36
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159259 Call, 1 Queries, Processed in 0.015625 second(s),