ATmega168的SPI发送完寄存器SPIF不置位的问题

来源:本站
导读:目前正在解读《ATmega168的SPI发送完寄存器SPIF不置位的问题》的相关信息,《ATmega168的SPI发送完寄存器SPIF不置位的问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ATmega168的SPI发送完寄存器SPIF不置位的问题》的详细说明。
简介:ATmega168的SPI发送完寄存器SPIF不置位的问题

利用ATmega168的硬件SPI驱动74HC595来扩展串行接口。把MOSI和SCK设置为输出,然后设置好寄存器。,具体如下:

static void vSpi595Init(void)

{

DDRB|=(1<

DDRD|=(1<

SPCR=(1<<spe)|(1<<mstr)|(1<<spr0)|(1<<spr1); 使能spi主机模式传送速度。<="" p="">

}

然后调用如下的发送函数

static void vSPIMasterTransmit(unsigned char ucData)

{

SS_L();//拉低存储寄存器时钟

SPDR = ucData;// 启动数据传输

while(!(SPSR & (1<<spif))); 等待传输结束<="" p="">

SS_H();//拉高存储寄存器时钟

}

却发现死活不产生SPIF的中断。更换芯片,调整时钟和SPI数率都不管用。

后来去ouravr网站去搜,发现好多人碰到同样的问题,并且恰恰有个人给出了解决方法。就是需要把SS管脚设置为输出才行。

修改后的初始化函数为

static void vSpi595Init(void)

{

DDRB|=(1<

DDRD|=(1<

SPCR=(1<<spe)|(1<<mstr)|(1<<spr0)|(1<<spr1); 使能spi主机模式传送速度。<="" p="">

}

就是说当作为主机的时候,SS必须设置为输出,而芯片复位后该SS引脚默认为输入,所以必须程序中主动设置一下。再Datasheet里面好像也没有明确指出这一点。

提醒:《ATmega168的SPI发送完寄存器SPIF不置位的问题》最后刷新时间 2024-03-14 01:08:33,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ATmega168的SPI发送完寄存器SPIF不置位的问题》该内容的真实性请自行鉴别。