打印
[AVR单片机]

关于SPI的发送完成标志SPIF问题

[复制链接]
4739|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
donkey89|  楼主 | 2010-1-10 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 donkey89 于 2010-1-10 13:58 编辑

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

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

uint8_t spi_master_tran(uint8_t data)
{
        SPDR=data;
        while(!(SPSR & (1<<SPIF)));
        //_delay_us(100);
        return SPDR;
}

//读FLASH的设备号
void flash_read_id(uint8_t *id)
{
        LOW_CS();
        spi_master_tran(FLC_READ_ID);
        *id++=spi_master_tran(0);
        *id++=spi_master_tran(0);
        *id++=spi_master_tran(0);
        HIGH_CS();
}

相关帖子

沙发
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

粉丝