Cypress技术william hill官网
直播中

张敏

7年用户 1582经验值
私信 关注
[问答]

如何进行I2C主读取?

我们正在研究一个项目,我们想用一个CyPress PSOC4 MCU管理VISHY VEML6040 I2C颜色传感器。我们有困难处理结果,我们从传感器得到了什么,所以我开始调试这个问题。起初,我尝试与另一个主机通信,使用逻辑模式生成器在比特敲击模式,传感器工作完美。
然后,从CyPress侧开始分析I2C传输,并注意到MCU的一些奇怪行为。似乎从传感器的字节不是正确的顺序,有时与我的逻辑分析仪结果相比被破坏了。
我尝试用以下C函数来管理传感器(数据速率:100kbpFIFO字节模式:8位,SW:PSOC创建者3.3 +SP2,HW:CY8C4248LQI-BL583CYCKIT-042-BLU-A)
UtiT32 Read Curror传感器(UIT32命令){UTIT32结果=0;//来自颜色传感器UTIT32 RESH=0的数据;//数据高字节UTIT32 RESL=0;//数据低字节UIT32 SLaveAddie= 0x10;/ / RGB颜色传感器I2CMYI2CMASTESTESTART(SLAVEADD,1)的地址;//开始转移到地址=0x10+WR I2CMY2I2CMASTErWrEdEnter(命令);//发送命令字节(传感器内部地址)I2CMYI2CMASTESTEnDebug(SLaveAdd,0);/ /发送重启到地址=0x10+RD RESL= I2CMYI2CMASTRADESENTELL字节(1U);/ /读取低字节RESH=I2CMY2CMASTATEDATABLE字节(1U);/ /读取低字节I2CMYI2CMASTESTESTSTOP();//停止传输结果=(RESH & lt;8)+RESL;返回结果;首先,我们发送起始位和从地址,然后设置从属命令寄存器(这是内部地址,选择从传感器读取的颜色级别),然后用地址发送重复启动,最后读取两个字节。奴隶,然后完成传输与停止位。
在深入分析了I2C API之后,我发现,I2CMJi2CMASTESTEntRead API函数在发送起始位后,会产生8个额外的时钟,以及地址字节,如您在附件中所看到的(在调用I2CMJI2CMASTESTEntRead函数后停止该软件)。我猜想这些额外的时钟会导致数据字节的混乱。我花了很多时间阅读CyPress文档和调试API来更好地理解串行通信块的工作原理,但是我无法发现总线传输是如何触发的。我标记了附加的逻辑分析器模式(I2CyTrimeLogLogyPalay.PNG),如何由API指令触发字节传输,而在我看来这并不是很重要。
1。I2CMJI2CMASTESTESTART(SLAVEADD,1);
在这个API函数中,从地址写入到TX缓冲器(I2CMYTXFIFOXWRYRG = SLaveAdvter);然后在I2CYMYCMD寄存器(I2CMYI2CYMSTROMGEGATEATYSTART START;)中设置MyStRADION OND空闲位,这导致生成起始位,并将地址数据写入总线。
2。I2CMJI2CMASTEMWRITE字节(命令);
在这个FuntCon中,TX缓冲器的写入(I2CMYTXYFIFOXWRYRG=THEL字节)开始传输,并导致9个SCL脉冲的时钟发生。
三。I2CMJI2CMASTESTEnDebug(SLaveAdd,0);
首先在I2CYMYCMD寄存器中设置MYSTART位(I2CMY2I2CYMSTROMENGATEATHORATION;)-在总线上没有发生任何事情,然后将地址写入TX缓冲器(I2CMYTXFIFOXWRYRG = SLaveAdvor;),这发出重复的起始位,写入地址字节,之后时钟9个额外脉冲到T。他乘公共汽车…
总而言之,我有两个问题。
1。我想知道,如何在重复启动条件下实现这两个字节的读取。
2。除了PSoC 4 BLE寄存器技术参考手册和PSoC 4 BLE架构技术参考手册,我还能找到更多的信息来让我们自己的API管理SCB外设吗?
谢谢你的回答!
I2C传递逻辑分析
31 K
VEML6040II2C.Read PNG
8 K

回帖(10)

王琳

2019-10-29 09:11:32
欢迎来到william hill官网 。
当您使用了已定义的y值i2CMyi2cxWrreEx xFelx模式时,读取所有值的相应值将是正确的。对于所需的ACK和NACK,也有相同的常量。使阅读比0x01更容易,并且不隐藏任何错误。
建立自己的外围设备?有关于组件构建的一般概要的“组件作者指南”。
尽管如此,您可以构建自己的API,而不是使用(工作)提供的API。
鲍勃
举报

张敏

2019-10-29 09:21:40
谢谢你的快速回答,鲍伯!我试着使用预定义的常量值,但是,正如我所说的,总线上没有变化:I2CMJI2CMASTESTEntRead函数仍然像以前一样生成额外的时钟脉冲。
举报

张敏

2019-10-29 09:47:46
给你。
SCBII2CCOMMAST.01. Cyrjj.Access 01.ZIP
1016.1 K
举报

王琳

2019-10-29 09:59:23
你不会终止最后一个字节红色的传输,它通常被奴隶接受,表示读取完成。
读取的结果可能已设置MSB以指示错误。SeNestTo()、RealByTE()和sEntStutter()返回一个状态来指示错误条件。至少在测试期间,我建议您检查返回的值。
鲍勃
举报

更多回帖

发帖
×
20
完善资料,
赚取积分