打印
[AVR单片机]

mega16硬件SPI写数据的问题,,SPDR一直是0xFF...

[复制链接]
9278|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
//**********************mcu端口初始化子程序*************************************
//**********************mcu端口初始化子程序*************************************
void Port_Init(void)
{
PORTA = 0xFF;
DDRA = 0xFD; // display data
PORTB = 0xFF; //PB7->SCK,PB5->SI.PB4->CS拉高 , PB6->SO拉高
DDRB = 0xB3; // PB7->SCK,PB5->SI.PB4->CS输出, PB6->SO输入
PORTC = 0xC3; //m103 output only
DDRC = 0xC2; // PC0->key1 PC1->LED PC7..6->dispaly h&l
PORTD = 0x78;
DDRD = 0x00; //
}
//***************************SPI初始化子程序************************************
void Spi_Init(void)
{
uchar temp;
SPCR |= 0x73;//0x51; //不使用SPI中断,其它同上 1/4晶振速率
SPSR = 0x00; //setup SPI 0x01双倍速率
temp = SPSR; //!!!
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
}

//************************************SPI写子程序*******************************
unsigned char SPISendByte(unsigned char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
//************************************SPI读程序*********************************
unsigned char SPIRecvByte(void)
{
return SPISendByte(0x00); // 产生SCK时钟,读操作
}

我是使用的mega16硬件SPI,作为主机。。我SPI初始化和配置都写好了。。也检查了很多遍。。我测试SPI写一字节数据到SPDR数据寄存器中,但是写入以后,SPDR寄存器还是0xFF..不知道大家遇到这问题没有?。。有没有解决的办法?谢谢。。下面我把SPI的源代码贴出来。。大家看看:

相关帖子

沙发
huangxz| | 2013-5-10 22:46 | 只看该作者
SPDR只有收到数据的时候才能去读

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
qin552011373 + 4 很给力!
板凳
zhao3462910|  楼主 | 2013-5-11 21:59 | 只看该作者
huangxz 发表于 2013-5-10 22:46
SPDR只有收到数据的时候才能去读

SPDR寄存器..我看了手册..是可读可写的啊....我没有读SPDR...我是写数据进SPDR...写不进去..全是FF....

使用特权

评论回复
地板
huangxz| | 2013-5-11 23:04 | 只看该作者
zhao3462910 发表于 2013-5-11 21:59
SPDR寄存器..我看了手册..是可读可写的啊....我没有读SPDR...我是写数据进SPDR...写不进去..全是FF.... ...

写进去的数据是往外送的,只有收到的值才读得出来,
跟UDR有点类似,我猜想楼主可能是spi没有接MISO线没收到数据

使用特权

评论回复
5
zhao3462910|  楼主 | 2013-5-12 20:56 | 只看该作者
huangxz 发表于 2013-5-11 23:04
写进去的数据是往外送的,只有收到的值才读得出来,
跟UDR有点类似,我猜想楼主可能是spi没有接MISO线没收到 ...

我连上了MISO脚.....我是硬件仿真查看SPDR寄存器的..值是0xFF...我也测试过设置一个i变量...把SPDR寄存器的值赋值给i....i读出来的也是FF...

使用特权

评论回复
6
huangxz| | 2013-5-12 21:34 | 只看该作者
zhao3462910 发表于 2013-5-12 20:56
我连上了MISO脚.....我是硬件仿真查看SPDR寄存器的..值是0xFF...我也测试过设置一个i变量...把SPDR寄存器 ...

你把MISO脚接低电平(必须与SPI连接的外围器件断开),看SPDR读出的值是不是0

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
7
qin552011373| | 2013-5-13 06:58 | 只看该作者
huangxz 发表于 2013-5-12 21:34
你把MISO脚接低电平(必须与SPI连接的外围器件断开),看SPDR读出的值是不是0

不错的办法

使用特权

评论回复
8
zhao3462910|  楼主 | 2013-5-13 08:56 | 只看该作者
qin552011373 发表于 2013-5-13 06:58
不错的办法

办法是不错。。但是问题还在。。还需要努力。。版主有什么好的建议?

使用特权

评论回复
9
zhao3462910|  楼主 | 2013-5-13 09:02 | 只看该作者
huangxz 发表于 2013-5-12 21:34
你把MISO脚接低电平(必须与SPI连接的外围器件断开),看SPDR读出的值是不是0

我把SPI连接的器件电源断掉。。写SPI数据到SPDR中,就能看到SPDR中有数据了。。这是什么原因??硬件连接没错。。。连接的SPI器件我也换了一片新的。。。

使用特权

评论回复
10
huangxz| | 2013-5-13 09:15 | 只看该作者
zhao3462910 发表于 2013-5-13 09:02
我把SPI连接的器件电源断掉。。写SPI数据到SPDR中,就能看到SPDR中有数据了。。这是什么原因??硬件连接 ...

这个当然啊,就算你不写SPDR,你要去读SPDR也是可以的,SPDR是一个以为寄存器,写进去的会从MOSI移出去,而你看到的是根据sck从MISO采样得到的值.所以我们才建议你把MISO这个线拉低,看看收到数据是不是0
还有是你可以用示波器看看SPI的信号,总共才4根线,用普通四通道示波器就可以看了

使用特权

评论回复
11
zhao3462910|  楼主 | 2013-5-13 09:21 | 只看该作者
huangxz 发表于 2013-5-13 09:15
这个当然啊,就算你不写SPDR,你要去读SPDR也是可以的,SPDR是一个以为寄存器,写进去的会从MOSI移出去,而你 ...

那为什么我把SPI器件的电源接通后,再写数据进去,SPDR寄存器看到的是0XFF呢?。。电源断开的话。写SPI数据。SPDR寄存器看到的是正常的。。

使用特权

评论回复
12
huangxz| | 2013-5-13 09:23 | 只看该作者
zhao3462910 发表于 2013-5-13 09:21
那为什么我把SPI器件的电源接通后,再写数据进去,SPDR寄存器看到的是0XFF呢?。。电源断开的话。写SPI数 ...

什么叫正常"?

使用特权

评论回复
13
zhao3462910|  楼主 | 2013-5-13 09:44 | 只看该作者
huangxz 发表于 2013-5-13 09:23
什么叫正常"?

写数据的话,SPDR寄存器又数据啊。。

使用特权

评论回复
14
huangxz| | 2013-5-13 09:50 | 只看该作者
zhao3462910 发表于 2013-5-13 09:44
写数据的话,SPDR寄存器又数据啊。。

这样应该连发都没发出去,楼主还是上示波器吧,一切真相都会大白的

使用特权

评论回复
15
zhao3462910|  楼主 | 2013-5-13 10:06 | 只看该作者
huangxz 发表于 2013-5-13 09:50
这样应该连发都没发出去,楼主还是上示波器吧,一切真相都会大白的

我用示波器测试了。。示波器的写数据脚SI上有波形。。。SCK时钟也有波形。。CS也有波形。。我就是感觉很奇怪。。

使用特权

评论回复
16
huangxz| | 2013-5-13 10:14 | 只看该作者
zhao3462910 发表于 2013-5-13 10:06
我用示波器测试了。。示波器的写数据脚SI上有波形。。。SCK时钟也有波形。。CS也有波形。。我就是感觉很 ...

你把断点下在29行,然后发个数据,贴个波形图片出来看看

使用特权

评论回复
17
zhao3462910|  楼主 | 2013-5-13 10:26 | 只看该作者
huangxz 发表于 2013-5-13 10:14
你把断点下在29行,然后发个数据,贴个波形图片出来看看

  SI 脚上的波形。。。

使用特权

评论回复
18
huangxz| | 2013-5-13 10:40 | 只看该作者
zhao3462910 发表于 2013-5-13 10:26
SI 脚上的波形。。。

最好四个全有啊,而且关键是SO信号,这个数据决定了你spdr的内容

使用特权

评论回复
19
zhao3462910|  楼主 | 2013-5-13 11:02 | 只看该作者
huangxz 发表于 2013-5-13 10:40
最好四个全有啊,而且关键是SO信号,这个数据决定了你spdr的内容

             SCK时钟




                                                                                                                                            
                                                                                                                                                     SI脚
                                                



                                                                                                                                                         SO脚
        
                                                                                                                                                                CS脚      



以上四种波形是。SPI写数据的波形。。

使用特权

评论回复
20
huangxz| | 2013-5-13 11:08 | 只看该作者
zhao3462910 发表于 2013-5-13 11:02
SCK时钟

从波形上看你的SO线一直是高电平,当然SPDR是0xff了。SPDR接收是根据sck时钟信号采样SO信号得到的。
另外建议楼主以后同时采集4路信号,不要分开采集

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
qin552011373 + 4 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:物联网改变世界,提高生活品质!

342

主题

1189

帖子

6

粉丝