野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21383|回复: 13

研究过24L01底层函数的高手请进!

[复制链接]
发表于 2014-4-27 20:52:40 | 显示全部楼层 |阅读模式
研究底层函数很久!目前发现底层函数与时序图冲突!冲突如下:
BYTE SPI_Read(BYTE reg)
{
        BYTE reg_val;

          CSN = 0;                // CSN low, initialize SPI communication...  // CS为低,开始SPI传输
          SPI_RW(reg);            // Select register to read from..  // 设置读地址
          reg_val = SPI_RW(0);    // ..then read registervalue          // 读数据上面的SPI_RW(reg);已经读出寄存器状态了为什么还要送个0?
          CSN = 1;                // CSN high, terminate SPI communication   // 完成SPI传输

          return(reg_val);        // return register value        // 返回数据
}

而且送0时读出的永远应该是0x00寄存器的状态啊!
还有读数据的时候也有同样的问题,到底是时序图错了?还是底层错了?但是用这个底层确实能发送和接受数据啊!

到底是时序图错了?还是程序错了?
回复

使用道具 举报

发表于 2014-4-27 20:57:09 | 显示全部楼层
没感觉有什么冲突的地方啊,代码跟时序都是一致的。
你说说冲突在哪里?
回复 支持 反对

使用道具 举报

发表于 2014-4-27 20:58:27 | 显示全部楼层
发送 0 是为了产生CLK,SPI需要主机产生CLK的,跟时序图的是一致的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:02:23 | 显示全部楼层
栾端静 发表于 2014-4-27 20:57
没感觉有什么冲突的地方啊,代码跟时序都是一致的。
你说说冲突在哪里?

不是一致!是严重不符,reg_val = SPI_RW(0);0=0x00,,所以0就是指令,这个指令的意思是配置config寄存器的意思,那么根据时序图,reg_val应该是config寄存器的状态!时序图明确写了,Cn是指令,Sn是状态,所以我认为reg_val正是config寄存器的状态!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:04:39 | 显示全部楼层
栾端静 发表于 2014-4-27 20:58
发送 0 是为了产生CLK,SPI需要主机产生CLK的,跟时序图的是一致的。

但是0就是指令0x00啊!说明即使你送0,那么0x00指令还是上去了的!那么reg_val就是config寄存器的状态!
回复 支持 反对

使用道具 举报

发表于 2014-4-27 21:07:05 | 显示全部楼层
明明 发表于 2014-4-27 21:04
但是0就是指令0x00啊!说明即使你送0,那么0x00指令还是上去了的!那么reg_val就是config寄存器的状态!

你认真看看时序图,都是符合的。

reg_val = SPI_RW(0);

这里是第二个指令,读寄存器的时候是黑色的,也就是说无关重要,不存在你说的这些情况。你可以改成0xFF,也是正常的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:11:29 | 显示全部楼层
栾端静 发表于 2014-4-27 21:07
你认真看看时序图,都是符合的。

reg_val = SPI_RW(0);

但是改成0xff是不跟指令冲突,但是以后就读不到接受来的数据了!如果把0改成0xff的话,不管收到什么,那么读出来的数据都是0xff,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:17:48 | 显示全部楼层
栾端静 发表于 2014-4-27 21:07
你认真看看时序图,都是符合的。

reg_val = SPI_RW(0);

我是不是把24L01研究的太深了?有点出不来了?
回复 支持 反对

使用道具 举报

发表于 2014-4-27 21:20:24 | 显示全部楼层
明明 发表于 2014-4-27 21:11
但是改成0xff是不跟指令冲突,但是以后就读不到接受来的数据了!如果把0改成0xff的话,不管收到什么,那么 ...

不是改成 0xFF 的问题,而是时序图上第二个字节的 MOSI 数据是无效的,发送任何数据都是不会处理的。仅仅用作产生CLK。你可以改成其他0~0xFF之间任何一个数,都是一样的。
回复 支持 反对

使用道具 举报

发表于 2014-4-27 21:21:34 | 显示全部楼层
明明 发表于 2014-4-27 21:17
我是不是把24L01研究的太深了?有点出不来了?

留意读操作的时序图上的字节顺序,你搞混了,Cn 是指主机发出的第一个字节,第二个字节是无意义的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:28:21 | 显示全部楼层
锺离思涵 发表于 2014-4-27 21:20
不是改成 0xFF 的问题,而是时序图上第二个字节的 MOSI 数据是无效的,发送任何数据都是不会处理的。仅仅 ...

哦  !这个问题我明白了!神!还麻烦你一下啊,还有一个问题,reg_val=SPI_RW(reg);与SPI_RW(reg);reg_val = SPI_RW(0);
这两句的效果一样!发送指令的同时带回来的第一位是状态位,以后的位都是数据位,那么这样前面一条的值应该是状态值后面两条读出来的应该是数据,为什么2者一样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:29:17 | 显示全部楼层
锺离思涵 发表于 2014-4-27 21:21
留意读操作的时序图上的字节顺序,你搞混了,Cn 是指主机发出的第一个字节,第二个字节是无意义的。

这一点我真的给忽略了!
回复 支持 反对

使用道具 举报

发表于 2014-4-27 21:30:55 | 显示全部楼层
明明 发表于 2014-4-27 21:28
哦  !这个问题我明白了!神!还麻烦你一下啊,还有一个问题,reg_val=SPI_RW(reg);与SPI_RW(reg);reg_va ...

reg_val=SPI_RW(reg);  reg_val 的值是状态寄存器


SPI_RW(reg);reg_val = SPI_RW(0);   reg_val  的值是读取reg的值,如果reg刚好是值状态寄存器,那么上述两者都是相同的。如果reg是其他寄存器,那就不同了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 21:35:35 | 显示全部楼层
栾端静 发表于 2014-4-27 21:30
reg_val=SPI_RW(reg);  reg_val 的值是状态寄存器

那么你是说只有状态寄存器的值是一样的呗?也就是说状态寄存器的状态值与数据值是一样的呗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:46 , Processed in 0.032665 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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