专栏中心

EEPW首页 > 专栏 > ATmega168的SPI发送完寄存器SPIF不置位的问题

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

发布人:0750long 时间:2009-06-16 来源:工程师 发布文章
ATmega168的SPI发送完寄存器SPIF不置位的问题

 

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

static void vSpi595Init(void)
{
  DDRB|=(1<<PB3)|(1<<PB5);  //设置io口状态,spi的mosi和sck输出
  DDRD|=(1<<PD5);                   //设置595锁存引脚的方向

  SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI主机模式传送速度。
}

然后调用如下的发送函数

static void vSPIMasterTransmit(unsigned char ucData)
{
   SS_L();                                        //拉低存储寄存器时钟
   SPDR = ucData;                          // 启动数据传输 
    while(!(SPSR & (1<<SPIF)));    // 等待传输结束
    SS_H();                                     //拉高存储寄存器时钟
}

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

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

修改后的初始化函数为

static void vSpi595Init(void)
{
  DDRB|=(1<<PB3)|(1<<PB5))|(1<<PB2);    //设置io口状态,spi的mosi和sck  SS输出
  DDRD|=(1<<PD5);                   //设置595锁存引脚的方向

  SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI主机模式传送速度。
}

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

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

博通公司CCBN2011主要展品介绍

视频 2011-03-29

关于pb4.2

hedonghe 2005-04-04

米尔电子与安路科技达成IDH生态战略合作,共筑FPGA创新生态

Ceva用于边缘人工智能的神经处理单元IP获Nextchip下一代 ADAS 解决方案选用

SIMPLE SWITCHER易电源LMZ2电源模块系列介绍

日本政府拟2025年成Rapidus股东,修法已通过

EDA/PCB 2025-04-25

基于BP神经网络的多变量PID解耦控制

FAN5400电池充电器IC

TrueFFS的问题

jwp11 2005-04-04

尼得科精密检测科技参展PCIM Expo & Conference 2025

SIMPLE SWITCHER易电源均流特性的演示

视频 2011-04-15

基于DSP的PID温度控制系统

资源下载 2007-12-30

台积电高歌猛进,二线厂商业绩承压

EDA/PCB 2025-04-25

TE Connectivity公布2025财年第二季度财报,销售额和每股收益均高于预期

基于FF现场总线的PID控制算法应用研究

Microchip推出面向边缘人工智能应用的新型高密度电源模块MCPF1412

创新推动了电压基准的技术发展水平

视频 2011-03-29

2025瑞能半导体(大中国区)经销商大会举行

ST以Teseo VI重新定义GNSS在智能驾驶中的应用

基于模糊PID的车辆侧倾主动控制仿真研究

澜起科技Q1利润翻倍!DDR5市占全球第一

基于BP神经网络整定的PID控制

更多 培训课堂
更多 焦点
更多 视频

技术专区