laoguren 发表于 2012-11-1 23:25:35

SPI通信一定要接MOSI么?

我现用mega16和DSP通过SPI进行通信,DSP主,它只需从mega16中接收数据,然后处理就行。
是否可以只接:SCK,MISO,SS三线。

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

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

longwu537 发表于 2012-11-1 23:33:07

从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的

channe 发表于 2012-11-1 23:42:13

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

eblc1388 发表于 2012-11-2 00:00:18

提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。

zxq6 发表于 2012-11-2 08:18:56

其实,单向通信,两根线就可以了,另外,数据线不能交叉

zhengxg1990 发表于 2012-11-2 08:21:45

eblc1388 发表于 2012-11-2 00:00 static/image/common/back.gif
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。

恩,非常需要!

redroof 发表于 2012-11-2 08:24:00

mosi=master out, slave in
miso=master in, slave out
你说应当怎么连??

chinmel 发表于 2012-11-2 08:37:10

SPI接口本身就已经说明了传输方向,不需要再交叉了。
另一个原因是SPI是主从通信,从角色角度就避免了交叉问题。
不像串口,是不分主从的,自然要交叉了。

xinfa190 发表于 2012-11-2 09:13:36

说交叉的人真应该面壁

zpxa001 发表于 2012-11-2 10:07:46

zxq6 发表于 2012-11-2 08:18 static/image/common/back.gif
其实,单向通信,两根线就可以了,另外,数据线不能交叉

确实如此

RUANJI 发表于 2012-11-2 10:31:34

longwu537 发表于 2012-11-1 23:33 static/image/common/back.gif
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 ...

拉出去毙了。

laoguren 发表于 2012-11-2 19:13:42

两线?那怎么启动SCK呢,请高人指点{:cry:}
空数据根本发不出去啊,是不是非得接MOSI啊?
如有知道,请详细告知,谢谢!

wuxihuaxing 发表于 2012-11-3 10:49:32

这个和串囗不同,不能交叉,我就上过当,费了不少时间,后来读了手册才明白.

korgo 发表于 2012-11-3 11:13:36

知道主从就知道怎么接了

laoguren 发表于 2012-11-3 11:59:58

现在接线不是问题,各条线一一对应,但现在问题是我只接SCK,MISO,SS三线,主机输出线MOSI没接,主机虚发数据后,程序停留在发送完成等待那不动了,表明数据没发出去,所以也没有SCK,MISO的数据也接收不回来。

airbox 发表于 2012-11-3 15:10:48

本帖最后由 airbox 于 2012-11-3 15:13 编辑

laoguren 发表于 2012-11-3 11:59 static/image/common/back.gif
现在接线不是问题,各条线一一对应,但现在问题是我只接SCK,MISO,SS三线,主机输出线MOSI没接,主机虚发数 ...

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

laoguren 发表于 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 = *SPIRXBUF;//接收从机数据
}

laoguren 发表于 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就不停发送

longwu537 发表于 2012-11-3 16:38:19

额~差点又成功的误人子弟了

laoguren 发表于 2012-11-3 18:09:31

哪位大侠给我指引一下啊,现在仿真,发现初始化后,SPI的各寄存器都没反应,全是0,诡异吧
初始化都不行,SCI和其他功能的寄存器都可以?莫非器件的SPI坏了,太巧了吧

laoguren 发表于 2012-11-3 19:39:36

搞定了,原来系统初始化设置的问题,命苦,偏偏把SPI设置成禁止,其他都开了,很少注意,点背啊

pang123hui 发表于 2012-11-3 19:53:15

longwu537 发表于 2012-11-1 23:33 static/image/common/back.gif
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 ...

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

huanying1136 发表于 2012-11-24 09:49:56

eblc1388 发表于 2012-11-2 00:00 static/image/common/back.gif
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。

             对头
页: [1]
查看完整版本: SPI通信一定要接MOSI么?