搜索
bottom↓
回复: 32

SPI的只读函数为啥这么神奇?

[复制链接]

出0入0汤圆

发表于 2013-11-10 23:51:19 | 显示全部楼层 |阅读模式
各位大哥 我看了一个DEMO只读SI4432的数据是这样的 一下函数给形参为0X00 最后的返回值竟然不为0X00,跟着程序走了好几遍 感觉太奇怪了,有搞过SI4432的大哥又遇到过这个问题吗?
unsigned char spi_byte(unsigned char TRdata)
{
        unsigned char i;

        for (i = 0; i < 8; i++)                                // 控制SCK 和 SDI,发射一个字节的命令,同事读取1个字节的数据
        {                                                                        // 没有包括nSEL的控制
                if (TRdata & 0x80)
                        SDI = 1;
                else
                        SDI = 0;
                       
                TRdata <<= 1;
                SCK = 1;
                P1MDIN&=0XF6;
                if (SDO)
                        TRdata |= 0x01;
                else
                        TRdata &= 0xfe;
                       
                SCK = 0;
        }

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-11-11 00:57:09 | 显示全部楼层
有什么奇怪的呢?

出0入0汤圆

发表于 2013-11-11 08:39:50 | 显示全部楼层
你的程序里面根本没定义返回值

所以返回值是随机的。。。

楼主你太调皮了

本帖子中包含更多资源

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

x

出0入17汤圆

发表于 2013-11-11 08:45:13 | 显示全部楼层
楼主太调皮了!

出20入186汤圆

发表于 2013-11-11 08:50:38 | 显示全部楼层
没有return语句编译不报错么?

出0入0汤圆

发表于 2013-11-11 09:04:02 | 显示全部楼层
你干嘛理会它的值呢

出0入0汤圆

发表于 2013-11-11 09:32:40 | 显示全部楼层
代码没贴全。大括号缺了一半。

出0入0汤圆

 楼主| 发表于 2013-11-11 09:52:53 | 显示全部楼层
好吧 我代码没贴全了 少了个RETURN ,

出0入0汤圆

 楼主| 发表于 2013-11-11 09:58:12 | 显示全部楼层
重新整理 这个程序形参为0X00在STC上跑是正确的返回值是一个指定的数,而在C8051上跑是错误的输出依然为0X00;
unsigned char spi_byte(unsigned char TRdata)
{
        unsigned char i;
       
        for (i = 0; i < 8; i++)                                // 控制SCK 和 SDI,发射一个字节的命令,同事读取1个字节的数据
        {                                                                        // 没有包括nSEL的控制
                if (TRdata & 0x80)
                        SDI = 1;
                else
                        SDI = 0;
                       
                TRdata <<= 1;
                SCK = 1;
               
                if (SDO)
                        TRdata |= 0x01;
                else
                        TRdata &= 0xfe;
                       
                SCK = 0;
        }
       
        return (TRdata);
}

出0入0汤圆

 楼主| 发表于 2013-11-11 09:58:58 | 显示全部楼层
bailangcn 发表于 2013-11-11 00:57
有什么奇怪的呢?

非常奇怪 代码已补全 请留意跟帖

出0入0汤圆

 楼主| 发表于 2013-11-11 09:59:40 | 显示全部楼层
xizi 发表于 2013-11-11 09:32
代码没贴全。大括号缺了一半。

大哥 想必做事是特别仔细认真的人
代码已补全 请留意跟帖

出0入0汤圆

 楼主| 发表于 2013-11-11 10:01:05 | 显示全部楼层
hyghyg1234 发表于 2013-11-11 09:04
你干嘛理会它的值呢

这个值我拿他有用哈 代码已贴全 请留意跟帖

出0入0汤圆

发表于 2013-11-11 10:07:21 | 显示全部楼层
弱弱的问一下,什么是只读SPI?

出0入42汤圆

发表于 2013-11-11 10:24:50 | 显示全部楼层
写的啥啊
             TRdata <<= 1; 这样的语句 SPI 的MOSI能工作么?

00为啥变了?
                if (SDO)
                        TRdata |= 0x01;
                else
                        TRdata &= 0xfe;


看书吧, 没有比这更基础的C知识了。

出0入0汤圆

发表于 2013-11-11 10:58:44 | 显示全部楼层
TRdata <<= 1 怎么影响SPI,也遇到到相识的情况?

出0入0汤圆

发表于 2013-11-11 11:30:04 | 显示全部楼层
SDO没有在这个函数里面定义  但是你用到了SDO   想必是全局变量了

SDO的值影响了return的值

也就是说   函数的返回值和函数本身运行结果无关。。。

出0入0汤圆

 楼主| 发表于 2013-11-11 11:39:06 | 显示全部楼层
albert_w 发表于 2013-11-11 10:24
写的啥啊
             TRdata

好吧 刚刚自己分析了良久搞懂了,

出0入0汤圆

发表于 2013-11-11 13:47:35 | 显示全部楼层
这尼玛不需要分析良久吧兄弟。。。

出0入0汤圆

发表于 2013-11-11 14:02:48 | 显示全部楼层
我想说i:呵呵

出0入0汤圆

 楼主| 发表于 2013-11-11 14:42:20 | 显示全部楼层
xou822 发表于 2013-11-11 13:47
这尼玛不需要分析良久吧兄弟。。。

  水平有限

出0入0汤圆

 楼主| 发表于 2013-11-11 14:45:55 | 显示全部楼层
xou822 发表于 2013-11-11 13:47
这尼玛不需要分析良久吧兄弟。。。

14楼大哥分析的对 这个函数确实存在问题,认真看过SPI后发现

出0入0汤圆

发表于 2013-11-11 15:07:43 | 显示全部楼层
嘿嘿,学习来了。

出0入0汤圆

发表于 2013-11-13 05:03:56 | 显示全部楼层
本帖最后由 xizi 于 2013-11-13 05:05 编辑

代码没有错,而且很精巧。
形参TRdata传进来的值从高位开始,8位依次送给SDI;同时SDO的值送给TRdata的低位,也是送8次。
结果是TRdata的旧值从SDI发出去,SDO的新值从TRdata收回来。

关键是要有SPI从属设备,结果才会正确。

出0入0汤圆

发表于 2013-11-13 08:32:12 | 显示全部楼层
楼主来个总结三  到底是怎么回事啊  

出0入54汤圆

发表于 2013-11-14 13:03:41 | 显示全部楼层
代码不全

出0入0汤圆

发表于 2013-11-14 13:55:51 | 显示全部楼层
返回值是不是等于0xff

出0入0汤圆

发表于 2013-11-14 14:02:27 | 显示全部楼层
代码没问题啊,在C8051上跑不对是不是IO的设置不对?

出0入0汤圆

发表于 2013-11-14 14:17:21 | 显示全部楼层
路过,笑了那“这尼玛不需要分析良久吧兄弟。。。”
要是我,我就恶补一下C了

出0入0汤圆

发表于 2013-11-14 15:33:42 | 显示全部楼层
SPI是时钟收发一体的。基本知识。仔细学习SPI原理。

出0入0汤圆

发表于 2013-11-14 15:47:52 | 显示全部楼层
学习了。。。

出0入0汤圆

 楼主| 发表于 2013-11-15 10:42:56 | 显示全部楼层
sme 发表于 2013-11-14 14:02
代码没问题啊,在C8051上跑不对是不是IO的设置不对?

端口初始化就直接打开了交叉 和端口整体拉高 , 就做了这一件事

出0入0汤圆

 楼主| 发表于 2013-11-15 10:53:34 | 显示全部楼层
xou822 发表于 2013-11-13 08:32
楼主来个总结三  到底是怎么回事啊

总结   1:C8051拿上述程序 写没有问题    2读依然读出的数据是00
           3依然没有解决

出0入0汤圆

发表于 2013-11-16 00:20:15 | 显示全部楼层
程序不需要改  也没加中断么   一般的IO口如何当计数器用啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 16:28

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

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