打印
[AVR单片机]

求助,AVR单片机间SPI通信的问题

[复制链接]
3853|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ry96695|  楼主 | 2013-1-21 21:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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,请问各位,这是个什么情况呢?该怎么办?是时序的问题吗??




相关帖子

沙发
dqyubsh| | 2013-1-21 23:18 | 只看该作者
是不是信号本身受干扰了?接口加驱动了没有?如果是我的话,1主多从的多机通讯会首先考虑485,这个应用比较规范。

先认真查时序吧,然后还得写调度程序,难度丝毫不亚于232/485。

使用特权

评论回复
板凳
huangxz| | 2013-1-21 23:22 | 只看该作者
接收方是不需要写SPDR的,不过看起来你的设置似乎还是有些问题。建议你在看看设置

使用特权

评论回复
地板
ry96695|  楼主 | 2013-1-22 00:59 | 只看该作者
huangxz 发表于 2013-1-21 23:22
接收方是不需要写SPDR的,不过看起来你的设置似乎还是有些问题。建议你在看看设置 ...

我最初接收的主机也没有写SPDR的,但是运行到while循环时,每次都首先跳到了写SPDR那句,不知道问题在哪儿

使用特权

评论回复
5
huangxz| | 2013-1-22 09:31 | 只看该作者
ry96695 发表于 2013-1-22 00:59
我最初接收的主机也没有写SPDR的,但是运行到while循环时,每次都首先跳到了写SPDR那句,不知道问题在哪 ...

而且接收方ss脚是有主机端控制的,手册里面有简单的例子,经测试是没有任何问题的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

1

粉丝