搜索
bottom↓
回复: 14

请教马老师Atmega16在作SPI从机发送数据时,MISO无端出现低...

[复制链接]

出0入0汤圆

发表于 2012-7-13 10:23:38 | 显示全部楼层 |阅读模式
如图:

Atmega16的SPI作为从机发送25位数据至上位机时,在发送完一字节(8位)后再发新字节时,MISO数据线在时钟设置沿(上升沿)后会出现1us的低电平,
我调置从机发送模式为模式2:CPOL=1,CPHA=0,即下降沿采样,上升沿设置;上位机时钟是250K,按道理在发完上一字节(数据为0x81),再发新数据(0xF1)时,MISO不应该出现低电平,在字节0x81和0xF1切换时应该是连续高电平,为何会出现短时低电平??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-7-13 10:54:48 | 显示全部楼层
请问楼主你的上位机程序是用什么软件做的?"上位机时钟是250K” 是怎么产生的?

出0入0汤圆

 楼主| 发表于 2012-7-17 15:01:05 | 显示全部楼层
上位机为西门子PLC模块

出0入0汤圆

发表于 2012-7-17 17:08:11 | 显示全部楼层
AVR 作为 SPI 从机发送超过 8位元 并不是容易的,原因是主机的 SCK 不会等待从机完成从新载入新的 8位元到 SPDR 内,而且AVR的 SPDR 在发送时并没有援存,一定要在发完才能载入新的 8位。

问题是:在 SCK 下降沿到达前,你有多小时间完成以上工序?


出0入0汤圆

发表于 2012-7-18 16:31:25 | 显示全部楼层
◆ 在字节0x81和0xF1切换时应该是连续高电平,为何会出现短时低电平??

MISO 出现短时低电平是由於主机发送的位元为低所致,但此是结果,不是起因。

起因是从机8位元发送後,AVR 需要重新载入8位元到 SPDR,以便主机下一个 SCK 下降沿能提取,但这操作需要时间。如编程不当,所花时间太长,则在 SCK 上升沿出现後,重新载入8位元到 SPDR 操作还未能完成,则 SPDR 内的现有位元(由主机刚发来的)便会直接输出到 MISO脚上,这就是你看见 MISO 出现的低电平。当然如果主机刚发来的是 0xFF,MISO 就不会出现低电平,那楼主的问题就会是 MISO 为何出现短时高电平。

及後重新载入8位元到 SPDR 操作完成,MISO 的状态便改为跟随载入的位元,幸好此时 SCK 下降沿还未到达,所以 PLC 接收不受影响。

但问题是:在 SCK 下降沿到达前,你还有多小时间令 MISO 电平变得稳定? 如时间小,那通讯便不可靠。

出0入0汤圆

 楼主| 发表于 2012-7-20 14:02:01 | 显示全部楼层
谢谢“eblc1388"的答乎。谢谢你深入的分析!有二点回复你的分析:
1: ”从机8位元发送後,AVR 需要重新载入8位元到 SPDR,以便主机下一个 SCK 下降沿能提取,但这操作需要时间。“  你说的这个时间足够了,上位机给从机的时钟是125K,也就是收发一个位是8us,而我用的是查询等待方式更新待发数据(while(!(SPSR&(1<<SPIF)));   SPDR=0xF1;),AVR晶振是8M,你可以算出最坏情况下执行这两条指令的时间,绝不超过4us,所以我有足够时间更新待发数据。

2:PLC只是发时钟给下位机,而不发数据到下位机,下位机只是被动跟随时钟发数据。故不存在”当然如果主机刚发来的是 0xFF,MISO 就不会出现低电平“这种情况

出0入0汤圆

 楼主| 发表于 2012-7-20 14:02:50 | 显示全部楼层
为什么见不到马潮老师出马?期待中...

出0入0汤圆

 楼主| 发表于 2012-7-20 14:04:59 | 显示全部楼层
对6楼的回复补充一下,PLC时钟可以选125K 或 250K,对于这两种时钟AVR用8M晶振都有足够时间更新待发新数据

出0入0汤圆

发表于 2012-7-20 15:37:10 | 显示全部楼层
◆ 所以我有足够时间更新待发数据。

这是你想象出来的,你有测过吗? 在你更新待发数据後,你可以把某埠其中一个位元反转,用 LA 就可以看到更新在整个通讯时序那一刻完成,你测一下吧,否则一切都是空谈。

◆ 2:PLC只是发时钟给下位机,而不发数据到下位机

SPI 可以只发时钟而不发数据吗?

出0入0汤圆

发表于 2012-7-20 15:43:28 | 显示全部楼层
lz位的图好像有问题,信号标的不清楚。

SPI是面向字节传送的,因此CLK时钟应该是8的倍数。除非你使用I/O模拟这个时序,此时时钟才可以送25位。

还有检查你使用的模式和实际需要是否符合

最好把SPI的初始化和从机发送代码贴上

出0入0汤圆

 楼主| 发表于 2012-7-23 14:52:53 | 显示全部楼层
马老师终于出现了,多谢马老师和eblc1388!问题原因找到了,但如何和eblc1388说的基本符合但目前没找到好的解决方法

出0入0汤圆

 楼主| 发表于 2012-7-23 15:04:22 | 显示全部楼层
我的SPI原理图如下:
attach://35451.jpg
SS为从机片选信号,SO为从机输出至PLC的数据(通过485芯片),CLKIN为PLC发给从机的时钟,而PB5 MOSI脚是悬空的,故如前述PLC只发25个时钟不发数据,从机响应时钟发25位数据到PLC。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-23 15:10:52 | 显示全部楼层
悬空的PB5 MOSI是产生那个数据切换时短暂低电平的罪魁祸首,如果我把MOSI用下拉电阻拉低,那么在SPI切换发新数据时,会出现短暂的低电平,如果我把MOSI用上拉电阻拉高,那么在SPI切换发新数据时,会出现短暂的高电平。如何解决呢?我想如eblc1388所说,单片机速度太慢,想把晶振换成16M的,各位对消除这个切换时的短暂电平还有什么好解决方法?

出0入0汤圆

发表于 2012-7-24 15:01:22 | 显示全部楼层
本帖最后由 machao 于 2012-7-24 15:02 编辑



to 972104:
建议你认真搞懂SPI协议的基本工作方式。许多基本概念你还是非常模糊的。
如果使用SPI的硬件接口,是不可以只发25个CLK的。如果送出数据是25个bit,应该发送4*8 = 32个CLK。
每发送完一个字节,应该立即进入SPI中断,马上把下一个要发送的字节装入发送寄存器。这样就与MOSI无关了。
给你个参考:

如果你只能通过25CLK串出25BIT数据,就不能使用SPI接口,需要使用I/O模拟的方式实现。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-29 13:35:53 | 显示全部楼层
谢谢马老师的指点,我会好好再学习下SPI协议
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 10:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表