完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我与先锋董事会和AyBLU-012011 EVD董事会合作。我已经实例化了一个I2C接口,我已经连接到一个外部的MCP47 25 DAC,由先锋板供电。我使用计数器对终端计数中断来触发对DAC的写入。我的中断服务程序只是设置一个标志,我的主程序检查。
当我尝试使用非阻塞的、中断驱动的API函数SCBJI2CMistRead EngBuf向DAC写入三字节时,I2C的输出具有正确的第一个字节(地址),但是三个字节的数据都是0个。但是,如果我在SCBII2CMistReaveBuf函数之后延迟。调用(Primtf或CyDelay(1U)),它工作正常。我能在示波器上看I2C总线。然而,这严重限制了我可以执行的I2C写的带宽——我受限于1毫秒的延迟。 然后,我更改了我的代码,使用单独的函数SCBII2CMASTESTESTART、SCBII2CMASTReWrdEnter字节和SCBJI2CMASTESTESTORT。这些也可以工作,我可以在大约12千赫下做I2C总线事务,但是因为它们是阻塞的,我不能做任何其他事情,而我的数据是写在I2C上,这将不会对我设计的项目工作。 你知道为什么SCBII2CMASTRESUBE BUF API函数以这种方式运行,有没有办法做更快、无阻塞的I2C事务?我正在附加我的项目包。 另一方面,我只使用UART和I2C通过使用100天项目(HRMLDATAGROGER)来工作。如果我从头开始,将我的代码复制到新项目中,UART或I2C都不工作。 谢谢。 HRMYDATAGROGER 2.4兆字节 |
|
相关推荐
10个回答
|
|
欢迎来到论坛,Juliea。
当你对包含I2C*M2I2CMistRead Buf的行取消注释时,你会得到警告。从字面上看!!!! I2CYM2I2CMASTRESUTIOBUF期待UIT8的数组,并传递UIT32的数组。因此,传输的前3个字节是0x00。 将您的WrimeBuffe更改为UIT8数组。然后,DAC所需的初始0x40将被转移,并且它应该按照预期运行。 FIY:参数类型UIT32被取代而不是更明显的UIT8,因为不需要转换来掩蔽不需要的比特等。可以被推到堆栈上的最小数量的数据是32位寄存器,因此处理字节可能导致一些不必要的开销。 鲍勃 |
|
|
|
请注意,当我取消包含I2C*M2I2CMistRead Buf的行时,我也不对上面的声明进行注释。我使用了UITC8数组,其中I2C*MYI2CMASTRESWORKE BUF,以及UTIT32写的Buff-BUF数组,带有一个UTIT32数组。因此,WreWiBuf参数类型匹配API类型I使用,并且它没有按预期运行。
|
|
|
|
这也不能解释为什么插入延迟(注释的Prtf或注释CyDelay)会解决这个问题。
|
|
|
|
这是你的MPC 4725电路还是你使用的是其他人设计的模块?如果是你的设计,你是否遵循布局建议。此外,我会在I2C组件的配置中减慢时钟,看看是否有帮助。
|
|
|
|
在做我的电路板设计之前,我仍在进行原型设计,所以我使用的是SpkFunBoad,用于MCP2425DAC。我曾使用100 kbps以前的I2C,但改变设计回到100 KBPSTO采取附加屏幕捕获。第一个被标记为“使用阻塞函数调用”的是使用SbCBII2CMASTESTESTART、SCBII2CMASTReWrdEnter字节和SCBJI2CMASTESTESTORL API调用和UTI32 DATABUFER。你可以看到I2C地址和3字节的非零数据。第二个标记为“单函数调用”使用了SbCBII2CMistWrreBuffAPI和Unt8DiguffFER。您可以看到I2C地址,但是所有3个数据字节都是0个。第三屏幕捕获仍然使用UCBI8DATABUFER的SCBCBI2CMASTREST BUFAPI,但是在SCBCBI2CMistWrreBuf函数调用之后立即调用CyDelay(1)调用。同样,I2C地址和3字节的非零数据是可见的。更改API调用(和相应的数据缓冲区数据类型)是屏幕捕获之间唯一的区别。因此,关于CBS2IcCistWrrestBuffAPI调用有一些事情,除非涉及某种长延迟,否则它似乎不起作用。请注意,我已经发送了三个字节,每100MS具有相同的结果(我可以发送I2C数据每91US与阻塞API调用),所以它似乎不我可以征税的速度I2C接口。
用CyDelay.jpg调用单个FCN 140.8 K 单个FCN调用 138.4 K 离散FCN调用 137.8 K |
|
|
|
100kHz时钟是最大正常时钟频率。如果您想高速运行,您需要向该模式发送部分命令,而在代码中我看不到。
|
|
|
|
这个问题看起来像是一个时间问题,这就是为什么我说降低时钟速度。也看你的范围图片为什么时钟信号有丢失的过渡。下面两张照片显示了这一点,他们不应该有任何问题的时钟。也是一个问题,你正在使用上拉电阻在I2C线。
|
|
|
|
是的,我已经降低了时钟速度,但这并没有改变问题。火花板在I2C线上有4.7kPulLuxPrimistor。HTTPS://CDN.SPARKFUN.COM/DATABEETS/BrutOutBARD/MCPP2525BractOutV4.VPDF
底层2幅图片和第一个图片之间唯一的区别是,我使用了SbbIiC2MistWrrestBuf在TaskBi2iCdMeStEnScript、SbbI2CdMistWrreEngEnter和ScByI2CMeMsStEdStutt的底部。第一项工作是在不发送特殊命令的情况下实现更高的时钟速度。无论时钟速度、写入命令的频率,还是发送特殊命令,SCBII2CMASTREST WEB BUF都不工作。 |
|
|
|
因此,问题归结为使用SCBJI2CMASTECKESTRESUBE BUF(非阻塞、中断驱动、但不工作)和使用SCBJI2CMASTESTESTART、SCBII2CMASTECWRESTELL字节和SCBJI2CMASTESTESTORT(这是有效的,但因为它们阻塞了,它们完全耗尽了我的时间预算)。必须使用阻塞API调用使CyBul-012011成为我的初学者。
|
|
|
|
我仍然不确定CyLab-012011将运行得足够快,但我在另一个100天代码示例中找到了我的问题的解决方案。在SCBY12cMistWrreBuf调用之后,我需要做以下操作,直到写完成为止。现在,我可以写得更快,而不需要长时间的延迟。
当(0U==(SCBJI2CMASTSTATESUSER)和;SCBII2CYMSTATEXWRESCMPLT){/*等待直到主完成写*/}(0U==(SCBII2MyStRyxErxxFER &;SCBII2CMASTSTATUS())){Stase= CyrReType成功;} /*清除I2C主状态*//(空隙)SCBYI2CMASTRESATSTATUS(); |
|
|
|
只有小组成员才能发言,加入小组>>
756个成员聚集在这个小组
加入小组2124 浏览 1 评论
1865 浏览 1 评论
3681 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1800 浏览 6 评论
1545 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
605浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
450浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
448浏览 2评论
400浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
1081浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 12:09 , Processed in 1.125654 second(s), Total 92, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号