本帖最后由 ry96695 于 2013-1-21 22:15 编辑
最近在做一个数据采集的有线通信设计,选择采用SPI进行设计:即用SPI主机循环读取各个从机的数据。
AVR单片机均为Atmega32,其中一个固定做主机,其余为从机。
目前仅用一个主机去接收一个从机的数据,
现在问题是主机只能接收到部分从机的数据,看起来好像是时序不对,先贴上主要部分程序,后面描述症状:
主机程序
//使用SPI接收一个字节数据
unsigned char spi_receive(unsigned char data)
{
unsigned char temp;
SPDR = data;
while(!(SPSR & (1<<SPIF)));
temp = SPDR;
return temp;
}
int main()
{
init_devices(); //初始化
while(1)
{
//使能P4,P4为其中一个从机
PORTD &= 0x7F;//使能SPI引脚CS_3
for(unsigned char i=0;i<20;i++)
{
Data_Buf = spi_receive(0xFF);
}
USART_SendAllData(); //将接收到的数据用串口发送到PC的串口调试助手 ,发送时还在每一组前添加帧头AA,结尾添加帧尾BB
PORTD |= 0x80;//停止CS_3
}
}
从机程序
//使用SPI发送一个字节数据
unsigned char spi_transmit(unsigned char cData)
{
unsigned char temp;
SPDR = cData; //启动数据传输
while(!(SPSR & (1<<SPIF)));
temp=SPDR;
return temp;
}
int main()
{
init_devices(); //初始化
while(1)
{
Data_Buf[]=[0x01,0x02,0x03..........0x09,0x0A,0x0B,..........0x11,0x12];
//Data_Buf[]应该为读取其他传感器的数据,此处为测试SPI通信,先赋值为1到18,用十六进制表示
if((PINB & 0x01) == 0x00) //如果片选信号被拉低,SPI激活
{
SPI_Buf = 0xA4; //传送的数组以A4开头,B4结尾,方便和其他从机数据进行区分
spi_transmit(SPI_Buf);
for(int i=0;i<18;i++)
{
SPI_Buf = Data_Buf[ i ];
spi_transmit(SPI_Buf);
}
SPI_Buf = 0xB4;
spi_transmit(SPI_Buf);
}
}
}
主机主动去接收从机发送的数据,现在的问题是,从机的数组,仅有部分能传送到主机上,其余的全是FF,不知道是什么原因?
串口调试助手上显示的结果为(我标红了部分从机发送过来的数值)
AA 0E 0F 10 11 FF FF FF FF FF 07 08 09 0A 0B FF FF FF FF FF FF BB
AA FF FF FF FF FF FF FF FF FF 0C 0D 0E 0F 10 FF FF FF FF FF 06 BB
AA 07 08 09 0A FF FF FF FF FF FF FF 02 03 04 FF FF FF FF FF FF BB
AA FF FF FF FF FF FF FF FF FF 0B 0C 0D 0E 0F FF FF FF FF FF 0B BB
AA 0C 0D 0E 0F FF FF FF FF FF 0A 0B 0C 0D 0E FF FF FF FF FF 0A BB
AA 0B 0C 0D 0E FF FF FF FF FF 0A 0B 0C 0D 0E FF FF FF FF FF 0A BB
AA 0B 0C 0D 0E FF FF FF FF FF 0A 0B 0C 0D 0E FF FF FF FF FF 04 BB
AA 05 06 07 08 FF FF FF FF FF FF FF FF FF 02 FF FF FF FF FF FF BB
AA FF FF FF FF 11 12 B4 FF FF FF FF FF FF FF 0B 0C 0D 0E 0F FF BB
AA FF FF FF FF 05 06 07 08 09 FF FF FF FF FF FF FF FF FF FF FF BB
AA FF FF FF FF 0C 0D 0E 0F 10 FF FF FF FF FF 06 07 08 09 0A FF BB
AA FF FF FF FF FF FF FF FF FF FF FF FF FF FF 11 12 B4 FF FF FF BB
AA FF FF FF FF 11 12 B4 FF FF FF FF FF FF FF 0F 10 11 12 B4 FF BB
AA FF FF FF FF 0F 10 11 12 B4 FF FF FF FF FF 0F 10 11 12 B4 FF BB
AA FF FF FF FF 0F 10 11 12 B4 FF FF FF FF FF FF FF FF FF FF 07 BB
AA 08 09 0A 0B FF FF FF FF FF FF 02 03 04 05 FF FF FF FF FF FF BB
AA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 01 BB
AA 03 04 05 06 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF BB
AA FF FF FF FF 0F 10 11 12 B4 FF FF FF FF FF FF FF FF FF FF FF BB
AA FF FF FF 02 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 09 BB
AA 0A 0B 0C 0D FF FF FF FF FF 09 0A 0B 0C 0D FF FF FF FF FF 09 BB
AA 0A 0B 0C 0D FF FF FF FF FF 09 0A 0B 0C 0D FF FF FF FF FF 09 BB
AA 0A 0B 0C 0D FF FF FF FF FF 09 0A 0B 0C 0D FF FF FF FF FF 09 BB
AA 0A 0B 0C 0D FF FF FF FF FF 03 04 05 06 07 FF FF FF FF FF FF BB
而理论上我希望收到的一组数据应该是
AA A4 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 B4 BB
初始化时SPI均设置的16分频,Fsoc/16,请问各位,这是个什么情况呢?该怎么办?是时序的问题吗??
|