SPI通信一定要接MOSI么?
我现用mega16和DSP通过SPI进行通信,DSP主,它只需从mega16中接收数据,然后处理就行。是否可以只接:SCK,MISO,SS三线。
主 从
SCK--------SCK
MISO-----MISO
SS---------SS
这样,从机只负责发数据就可以,主机需要的时候就发空数据(MOSI另有他用,没有作为信号线使用),
启动SCK,然后从MISO得到数据,就可以了。
实际操作中,空信号发不出去。
难道非得接上MOSI才可以?从机接空信号没用啊。 从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 主 从
SCK--------SCK
MISO-----MOSI
SS---------SS 提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。 其实,单向通信,两根线就可以了,另外,数据线不能交叉 eblc1388 发表于 2012-11-2 00:00 static/image/common/back.gif
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。
恩,非常需要! mosi=master out, slave in
miso=master in, slave out
你说应当怎么连?? SPI接口本身就已经说明了传输方向,不需要再交叉了。
另一个原因是SPI是主从通信,从角色角度就避免了交叉问题。
不像串口,是不分主从的,自然要交叉了。 说交叉的人真应该面壁 zxq6 发表于 2012-11-2 08:18 static/image/common/back.gif
其实,单向通信,两根线就可以了,另外,数据线不能交叉
确实如此 longwu537 发表于 2012-11-1 23:33 static/image/common/back.gif
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 ...
拉出去毙了。 两线?那怎么启动SCK呢,请高人指点{:cry:}
空数据根本发不出去啊,是不是非得接MOSI啊?
如有知道,请详细告知,谢谢! 这个和串囗不同,不能交叉,我就上过当,费了不少时间,后来读了手册才明白. 知道主从就知道怎么接了 现在接线不是问题,各条线一一对应,但现在问题是我只接SCK,MISO,SS三线,主机输出线MOSI没接,主机虚发数据后,程序停留在发送完成等待那不动了,表明数据没发出去,所以也没有SCK,MISO的数据也接收不回来。 本帖最后由 airbox 于 2012-11-3 15:13 编辑
laoguren 发表于 2012-11-3 11:59 static/image/common/back.gif
现在接线不是问题,各条线一一对应,但现在问题是我只接SCK,MISO,SS三线,主机输出线MOSI没接,主机虚发数 ...
主机发送过程与外部接线是没有关系的,没有接线发送照样能完成,出现这样的情况应该是程序上的问题 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;//接收从机数据
} 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就不停发送 额~差点又成功的误人子弟了 哪位大侠给我指引一下啊,现在仿真,发现初始化后,SPI的各寄存器都没反应,全是0,诡异吧
初始化都不行,SCI和其他功能的寄存器都可以?莫非器件的SPI坏了,太巧了吧 搞定了,原来系统初始化设置的问题,命苦,偏偏把SPI设置成禁止,其他都开了,很少注意,点背啊 longwu537 发表于 2012-11-1 23:33 static/image/common/back.gif
从机发送是要接从机的MOSI的吧,类似于串口的交叉连接~你上面的MISI对MISI是不能通讯的 ...
误人子弟哦,不需要的,当初我就犯过这个错误 eblc1388 发表于 2012-11-2 00:00 static/image/common/back.gif
提出把 SPI 的 MOSI 或 MISO 像串口般交叉连接的应该要面璧思过。
对头
页:
[1]