[AVR单片机] 关于SPI的发送完成标志SPIF问题

[复制链接]
5394|3
 楼主| donkey89 发表于 2010-1-10 13:57 | 显示全部楼层 |阅读模式
本帖最后由 donkey89 于 2010-1-10 13:58 编辑

在主模式下,把数据写入SPDR寄存器以后,发送完成SPIF就应该置位了吧?即使是MISO引脚悬空也应该置位的吧?下面的代码执行flash_read_id会死掉的,奇怪了
  1. void init_flash(void)
  2. {
  3.         //IO的初始化
  4.         flash_port |=_BV(flash_cs);
  5.         flash_port |=_BV(flash_clk);
  6.         flash_ddr |=_BV(flash_cs);//falsh的片选
  7.         flash_ddr |=_BV(flash_di);//falsh的输入脚
  8.         flash_ddr |=_BV(flash_clk);//flash的时钟脚

  9.         //寄存器初始化
  10.         SPCR =_BV(SPE)|_BV(MSTR);//SPI使能,主模式
  11. }

  12. uint8_t spi_master_tran(uint8_t data)
  13. {
  14.         SPDR=data;
  15.         while(!(SPSR & (1<<SPIF)));
  16.         //_delay_us(100);
  17.         return SPDR;
  18. }

  19. //读FLASH的设备号
  20. void flash_read_id(uint8_t *id)
  21. {
  22.         LOW_CS();
  23.         spi_master_tran(FLC_READ_ID);
  24.         *id++=spi_master_tran(0);
  25.         *id++=spi_master_tran(0);
  26.         *id++=spi_master_tran(0);
  27.         HIGH_CS();
  28. }
suoma 发表于 2010-1-10 23:20 | 显示全部楼层
SPDR 数据寄存器为读/写寄存器,用来在寄存器文件 SPI移位寄存器之间传输数据。写寄存器将启动数据传输,读寄存器将读取寄存器的接收缓冲器。SPI 系统的发送方向只有一个缓冲器,而在接收方向有两个缓冲器。也就是说,在发送时一定要等到移位过程全部结束后才能对 SPI 数据寄存器执行写操作。而在接收数据时,需要在下一个字符移位过程结束之前通过访问SPI 数据寄存器读取当前接收到的字符。否则第一个字节将丢失。
 楼主| donkey89 发表于 2010-1-11 12:18 | 显示全部楼层
终于搞清楚了为什么SPIF没有置位,不是楼上的原因,与端口硬件有关,散分
HonMe 发表于 2010-3-14 10:54 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

241

主题

1609

帖子

1

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