zzsczz 发表于 2016-5-29 13:46:05

求助:2个avr全双工SPI传输数据,硬件测试和仿真结果不一致

本帖最后由 zzsczz 于 2016-5-29 14:13 编辑

atmega16A 作为spi master。通过 IO口 点亮 595驱动的 7段 LED,显示 发送和 接收的 数据,2个按钮 ,一个触发发送SPI数据并把数据+2,另一个增加数据值(+1但不发送)。

atmega328p作为 spi slave。   SPI传输中断中 采样AD3 ,在 SS 下降沿 (既 SPI使能但还没有传输数据时)更新SPDR。


2个AVR单片机 采用 硬件SPI外设 连接 。


仿真结果很好, spi master 可以显示 slave传回的数据,并显示 发送的数据。


下到真实硬件里面,spi master显示 的 数据 混乱,表现为 : 在   应该显示 SPI SLAVE 发送数据的2个 7SEG管   ,         slave传回的AD采样数据 和 MASTER发送 的数据         交替显示,即SPI MASTER 触发SPI传输,若显示了AD采样数据,下次触发触发SPI传输则显本次SPI master 发送的数据    (    可能 SLAVE 更新SPDR 失败,下次SPI传输 当前 MASTER 发送的数据)。


找了3周 不知道原因 ,请大伙看看 有啥问题。

环境 : PROTEUS 7.10 , AVR STUDIO 4.17


















zzsczz 发表于 2016-5-29 14:17:53

SPI slave 采集 3.3V 电压参考 5V
一个字节0x00 到 0xff表示 0到 5V ,3.3V 显示 AE AF都可以 。。。

初始态 MASTER发送0,收到 0x00;
再发送 2 ,收到 0XAE;
发送 4 ,收到 0x00(第一次 发送的数据);
再发送 6, 收到 0XAE;
再发送8 ,收到 0X04; (第二次 发送的数据);

依次类推 。。。。

god-father 发表于 2016-5-29 17:03:34

先调一个SPI设备,读写成功后在进行双机通讯

zzsczz 发表于 2016-6-1 22:20:31



可以工作了

在 SPI SLAVE的 中断SPI_STC_vect 中

1 读取 SPDR

       IOReg   = SPSR;
       IOReg   = SPDR;

2 再 修改SPDR

   即可




NOTE:
1 SPI MASTER的 SS需要写代码控制;
2   SPI MASTER在 数据被发送完成前,应避免写SPDR (否则,翻手册) ; SPI SLAVE 在接收一个字节后,若未能及时处理SPDR,新收到的数据会更新SPDR;



页: [1]
查看完整版本: 求助:2个avr全双工SPI传输数据,硬件测试和仿真结果不一致