[AVR单片机] mega16硬件SPI写数据的问题,,SPDR一直是0xFF...

[复制链接]
 楼主| zhao3462910 发表于 2013-5-10 11:52 | 显示全部楼层 |阅读模式
  1. //**********************mcu端口初始化子程序*************************************
  2. //**********************mcu端口初始化子程序*************************************
  3. void Port_Init(void)
  4. {
  5. PORTA = 0xFF;
  6. DDRA = 0xFD; // display data
  7. PORTB = 0xFF; //PB7->SCK,PB5->SI.PB4->CS拉高 , PB6->SO拉高
  8. DDRB = 0xB3; // PB7->SCK,PB5->SI.PB4->CS输出, PB6->SO输入
  9. PORTC = 0xC3; //m103 output only
  10. DDRC = 0xC2; // PC0->key1 PC1->LED PC7..6->dispaly h&l
  11. PORTD = 0x78;
  12. DDRD = 0x00; //
  13. }
  14. //***************************SPI初始化子程序************************************
  15. void Spi_Init(void)
  16. {
  17. uchar temp;
  18. SPCR |= 0x73;//0x51; //不使用SPI中断,其它同上 1/4晶振速率
  19. SPSR = 0x00; //setup SPI 0x01双倍速率
  20. temp = SPSR; //!!!
  21. temp = SPDR; //清空SPI,和中断标志,使SPI空闲
  22. }

  23. //************************************SPI写子程序*******************************
  24. unsigned char SPISendByte(unsigned char cData)
  25. {
  26. SPDR = cData;
  27. while(!(SPSR & (1<<SPIF)));
  28. return SPDR;
  29. }
  30. //************************************SPI读程序*********************************
  31. unsigned char SPIRecvByte(void)
  32. {
  33. return SPISendByte(0x00); // 产生SCK时钟,读操作
  34. }

我是使用的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线没收到数据
 楼主| zhao3462910 发表于 2013-5-12 20:56 | 显示全部楼层
huangxz 发表于 2013-5-11 23:04
写进去的数据是往外送的,只有收到的值才读得出来,
跟UDR有点类似,我猜想楼主可能是spi没有接MISO线没收到 ...

我连上了MISO脚.....我是硬件仿真查看SPDR寄存器的..值是0xFF...我也测试过设置一个i变量...把SPDR寄存器的值赋值给i....i读出来的也是FF...
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 很给力!

查看全部评分

qin552011373 发表于 2013-5-13 06:58 | 显示全部楼层
huangxz 发表于 2013-5-12 21:34
你把MISO脚接低电平(必须与SPI连接的外围器件断开),看SPDR读出的值是不是0

不错的办法
 楼主| zhao3462910 发表于 2013-5-13 08:56 | 显示全部楼层
qin552011373 发表于 2013-5-13 06:58
不错的办法

办法是不错。。但是问题还在。。还需要努力。。版主有什么好的建议?
 楼主| zhao3462910 发表于 2013-5-13 09:02 | 显示全部楼层
huangxz 发表于 2013-5-12 21:34
你把MISO脚接低电平(必须与SPI连接的外围器件断开),看SPDR读出的值是不是0

我把SPI连接的器件电源断掉。。写SPI数据到SPDR中,就能看到SPDR中有数据了。。这是什么原因??硬件连接没错。。。连接的SPI器件我也换了一片新的。。。
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根线,用普通四通道示波器就可以看了
 楼主| zhao3462910 发表于 2013-5-13 09:21 | 显示全部楼层
huangxz 发表于 2013-5-13 09:15
这个当然啊,就算你不写SPDR,你要去读SPDR也是可以的,SPDR是一个以为寄存器,写进去的会从MOSI移出去,而你 ...

那为什么我把SPI器件的电源接通后,再写数据进去,SPDR寄存器看到的是0XFF呢?。。电源断开的话。写SPI数据。SPDR寄存器看到的是正常的。。
huangxz 发表于 2013-5-13 09:23 | 显示全部楼层
zhao3462910 发表于 2013-5-13 09:21
那为什么我把SPI器件的电源接通后,再写数据进去,SPDR寄存器看到的是0XFF呢?。。电源断开的话。写SPI数 ...

什么叫正常"?
 楼主| zhao3462910 发表于 2013-5-13 09:44 | 显示全部楼层
huangxz 发表于 2013-5-13 09:23
什么叫正常"?

写数据的话,SPDR寄存器又数据啊。。
huangxz 发表于 2013-5-13 09:50 | 显示全部楼层
zhao3462910 发表于 2013-5-13 09:44
写数据的话,SPDR寄存器又数据啊。。

这样应该连发都没发出去,楼主还是上示波器吧,一切真相都会大白的
 楼主| zhao3462910 发表于 2013-5-13 10:06 | 显示全部楼层
huangxz 发表于 2013-5-13 09:50
这样应该连发都没发出去,楼主还是上示波器吧,一切真相都会大白的

我用示波器测试了。。示波器的写数据脚SI上有波形。。。SCK时钟也有波形。。CS也有波形。。我就是感觉很奇怪。。
huangxz 发表于 2013-5-13 10:14 | 显示全部楼层
zhao3462910 发表于 2013-5-13 10:06
我用示波器测试了。。示波器的写数据脚SI上有波形。。。SCK时钟也有波形。。CS也有波形。。我就是感觉很 ...

你把断点下在29行,然后发个数据,贴个波形图片出来看看
 楼主| zhao3462910 发表于 2013-5-13 10:26 | 显示全部楼层
huangxz 发表于 2013-5-13 10:14
你把断点下在29行,然后发个数据,贴个波形图片出来看看

  SI 脚上的波形。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
huangxz 发表于 2013-5-13 10:40 | 显示全部楼层
zhao3462910 发表于 2013-5-13 10:26
SI 脚上的波形。。。

最好四个全有啊,而且关键是SO信号,这个数据决定了你spdr的内容
 楼主| zhao3462910 发表于 2013-5-13 11:02 | 显示全部楼层
huangxz 发表于 2013-5-13 10:40
最好四个全有啊,而且关键是SO信号,这个数据决定了你spdr的内容

             SCK时钟




                                                                                                                                            
                                                                                                                                                     SI脚
                                                



                                                                                                                                                         SO脚
        
                                                                                                                                                                CS脚      



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:物联网改变世界,提高生活品质!

342

主题

1189

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部