请大家帮忙看看,DSPF2812的mcbsp设置SPI模式,DSP为主机,从机是AVR ATMEGA128,时钟停止模式,时钟频率分频后是37.5M,这里的SCK是MFSX引脚出来,1.875M。
问题应该是出在AVR里面,仿真时无论是从机接收还是从机发送,程序总是卡在while(!(SPSR&(1<<SPIF)));这里,看资料上的描述,SPIF这一位在数据传输结束后会自动置位,可是程序里一直是0.
AVR从机初始化如下
void SPI_SlaveInit(void)
{
/* 设置MOSI、SCK CS为输入,MISO为输出
CS SCK MOSI MISO
PB0 PB1 PB2 PB3
I I I O
0 0 0 1
*/
DDRB&=0x00;
DDRB|=0x08;
SPCR |=(1<<SPE)|(1<<CPHA); //SPI允许,从机模式,高字节在前,工作模式0,4分频
//SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
//0 1 0 0 0 1 0 0
}
在一些例程里也没有看到将接收器和发送器使能的语句,不知道是不是这个问题。SPE是使能SPI,CHPA是设置发送接收在上升下降沿的。
接收和发送子函数如下
char SPI_SlaveSend(char sdata)
{
SPDR=sdata; //把数据放入SPI数据寄存器,开始发送
while(!(SPSR&(1<<SPIF))); //等待数据传输结束
return SPDR; //接收主机传来的数据
}
char SPI_SlaveReceive(void)
{
while(!(SPSR&(1<<SPIF)));
return SPDR;
} |