[AVR单片机] 使用XMEGA C系列单片机的SPI时IF一直不置位

[复制链接]
 楼主| kiravsl 发表于 2014-9-18 15:02 | 显示全部楼层 |阅读模式
大家好,小弟在使用XMEGA C系列单片机的SPI时,STATUS寄存器中的IF一直不置位(SPI工作在主模式),串行传输一直未完成,导致下面代码中的while循环一直出不来。
通过调试,工作模式、片选信号都没问题。
不知道有什么原因会导致SPI STATUS寄存器中的IF一直不置位,有哪位大侠遇到过,帮帮忙解答一下。困扰几天了,多谢!
附上代码:

void spid_init()
{
  PORTD.DIR |= ((1<<4)|(1<<5)|(1<<7));  //4-ss,5-mosi, 7-sck
  PORTD.DIR &= ~(1<<6);//6-miso
  PORTD.OUT |= ((1<<4)|(1<<5)|(1<<7)); //all '1'
  
  SPID.CTRL = ( SPI_ENABLE_bm + SPI_MASTER_bm //MSB first in master
               //+ SPI_MODE1_bm
               //  +SPI_MODE0_bm
                   );//Mod0
  SPID.INTCTRL = 0;//(SPI_INTLVL1_bm + SPI_INTLVL0_bm ); //高级别中断
  SPID.STATUS = SPID.STATUS;
}

unsigned char spid_txbyte(unsigned char ch)
{
  SPID.DATA = ch;         
  while(!(SPID.STATUS&SPI_IF_bm));   
  return ( ch );
}

unsigned char spid_rxbyte(unsigned char ch)
{
  SPID.DATA = ch;     
while(!(SPID.STATUS&SPI_IF_bm));                                                     
  return (SPID.DATA);
}
airwill 发表于 2014-9-24 06:43 | 显示全部楼层
先测一下,spi 引脚有没有波形出来,来判断要发送的时候,spi 的设置有没有问题
 楼主| kiravsl 发表于 2014-9-25 16:17 | 显示全部楼层
多谢版主回答。是程序的问题,上面的程序有阻塞的风险,当使用SPI发送未完成时来了中断,中断处理函数中又马上使用SPI,就阻塞了。SPI传输换成中断方式处理就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

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