搜索
bottom↓
回复: 22

SPI通信一定要接MOSI么?

[复制链接]

出0入0汤圆

发表于 2012-11-1 23:25:35 | 显示全部楼层 |阅读模式
我现用mega16和DSP通过SPI进行通信,DSP主,它只需从mega16中接收数据,然后处理就行。
是否可以只接:SCK,MISO,SS三线。

主          从
SCK--------SCK
MISO-----MISO
SS---------SS

这样,从机只负责发数据就可以,主机需要的时候就发空数据(MOSI另有他用,没有作为信号线使用),
启动SCK,然后从MISO得到数据,就可以了。
实际操作中,空信号发不出去。
难道非得接上MOSI才可以?从机接空信号没用啊。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-11-1 23:33:07 来自手机 | 显示全部楼层
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的

出0入0汤圆

发表于 2012-11-1 23:42:13 | 显示全部楼层
主          从
SCK--------SCK
MISO-----MOSI
SS---------SS

出0入0汤圆

发表于 2012-11-2 00:00:18 | 显示全部楼层
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。

出0入22汤圆

发表于 2012-11-2 08:18:56 来自手机 | 显示全部楼层
其实,单向通信,两根线就可以了,另外,数据线不能交叉

出0入0汤圆

发表于 2012-11-2 08:21:45 | 显示全部楼层
eblc1388 发表于 2012-11-2 00:00
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。

恩,非常需要!

出350入477汤圆

发表于 2012-11-2 08:24:00 来自手机 | 显示全部楼层
mosi=master out, slave in
miso=master in, slave out
你说应当怎么连??

出0入0汤圆

发表于 2012-11-2 08:37:10 | 显示全部楼层
SPI接口本身就已经说明了传输方向,不需要再交叉了。
另一个原因是SPI是主从通信,从角色角度就避免了交叉问题。
不像串口,是不分主从的,自然要交叉了。

出0入0汤圆

发表于 2012-11-2 09:13:36 | 显示全部楼层
说交叉的人真应该面壁

出0入0汤圆

发表于 2012-11-2 10:07:46 | 显示全部楼层
zxq6 发表于 2012-11-2 08:18
其实,单向通信,两根线就可以了,另外,数据线不能交叉

确实如此

出0入0汤圆

发表于 2012-11-2 10:31:34 | 显示全部楼层
longwu537 发表于 2012-11-1 23:33
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 ...

拉出去毙了。

出0入0汤圆

 楼主| 发表于 2012-11-2 19:13:42 | 显示全部楼层
两线?那怎么启动SCK呢,请高人指点
空数据根本发不出去啊,是不是非得接MOSI啊?
如有知道,请详细告知,谢谢!

出0入0汤圆

发表于 2012-11-3 10:49:32 | 显示全部楼层
这个和串囗不同,不能交叉,我就上过当,费了不少时间,后来读了手册才明白.

出0入0汤圆

发表于 2012-11-3 11:13:36 | 显示全部楼层
知道主从就知道怎么接了

出0入0汤圆

 楼主| 发表于 2012-11-3 11:59:58 | 显示全部楼层
现在接线不是问题,各条线一一对应,但现在问题是我只接SCK,MISO,SS三线,主机输出线MOSI没接,主机虚发数据后,程序停留在发送完成等待那不动了,表明数据没发出去,所以也没有SCK,MISO的数据也接收不回来。

出50入8汤圆

发表于 2012-11-3 15:10:48 | 显示全部楼层
本帖最后由 airbox 于 2012-11-3 15:13 编辑
laoguren 发表于 2012-11-3 11:59
现在接线不是问题,各条线一一对应,但现在问题是我只接SCK,MISO,SS三线,主机输出线MOSI没接,主机虚发数 ...


主机发送过程与外部接线是没有关系的,没有接线发送照样能完成,出现这样的情况应该是程序上的问题

出0入0汤圆

 楼主| 发表于 2012-11-3 16:14:51 | 显示全部楼层
DSP主机程序
void SPI_Init()             //SPI-DA初始化
{
    *MCRB=*MCRB | 0x0038;     //SIMO为普通IO口,空着不用
    *SPICCR=0x0047;          //8bit数据
    *SPICTL=0x0004;          //DSP为主控制器
    *SPIBRR=0x0027;          //1M波特率,40M/40=1M
    *SPICCR=*SPICCR | 0x80;     //复位SPI
}
while(1)  
{
  *SPITXBUF = 0xFF;
  while((*SPISTS & 0x40) != 0x40);  //程序在这就停住了,why?
spi_data[n] = *SPIRXBUF;  //接收从机数据
}

出0入0汤圆

 楼主| 发表于 2012-11-3 16:30:34 | 显示全部楼层
mega16从机程序
#include <iom16v.h>
#include <macros.h>

void port_init(void)
{
PORTA = 0xFF;
DDRA  = 0x00;
PORTB = 0xF0; //SPI上拉
DDRB  = 0x40;//MISO输出,其他输入
PORTC = 0x03;
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

void spi_init(void) //spi初始化
{
   DDRB|=(1<<PB6)|(~(1<<PB7))|(~(1<<PB4));
   SPCR = 0xE1;//从机
   SPSR = 0x00;
}
void spi_send(uchar sData)
{
   SPDR = sData;
   while(!(SPSR & BIT(SPIF)));
   //sData=SPDR;//读从机发回来的数据
}

void main()
{
spi_init();
while(1)
{
spi_send(0x39);
}

}

//从机收到CLK就不停发送

出0入0汤圆

发表于 2012-11-3 16:38:19 来自手机 | 显示全部楼层
额~差点又成功的误人子弟了

出0入0汤圆

 楼主| 发表于 2012-11-3 18:09:31 | 显示全部楼层
哪位大侠给我指引一下啊,现在仿真,发现初始化后,SPI的各寄存器都没反应,全是0,诡异吧
初始化都不行,SCI和其他功能的寄存器都可以?莫非器件的SPI坏了,太巧了吧

出0入0汤圆

 楼主| 发表于 2012-11-3 19:39:36 | 显示全部楼层
搞定了,原来系统初始化设置的问题,命苦,偏偏把SPI设置成禁止,其他都开了,很少注意,点背啊

出0入0汤圆

发表于 2012-11-3 19:53:15 | 显示全部楼层
longwu537 发表于 2012-11-1 23:33
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 ...

误人子弟哦,不需要的,当初我就犯过这个错误

出0入0汤圆

发表于 2012-11-24 09:49:56 | 显示全部楼层
eblc1388 发表于 2012-11-2 00:00
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。

             对头
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表