完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
上图是我写的一段SPI测试程序,目的是用SPI向10片M25P64flash芯片发送读取ID的命令,再通过SPI总线把这些ID接收回来 片选用了gioA和gioB的一共10个接口,发送和接收调用了spi.c中的spiTransmitAndReceiveData()函数 程序最终没能实现预定功能,在单步调试的过程中,发现程序卡在spiTransmitAndReceiveData()函数中的 while((spi->FLG & 0x00000100U) != 0x00000100U) [ ] /* Wait */ 我觉得可能的原因是在设置dataconfig_t存在错误,但我对dataconfig1_t的四个值得具体含义不太了解,所以也不知道怎么设置才是正确的,请诸位前辈帮我解答一下吧 多谢! |
|
相关推荐
7个回答
|
|
简单一点,直接可以设成如下:
dataconfig.CSNR = 0; dataconfig.CS_HOLD = 0; dataconfig.DFSEL = 0; dataconfig.WDEL = 1; 另外需要注意SPI的管脚复用是否注意,另外关于SPI的配置是否正确。 谢谢 BR, KEN |
|
|
|
Ken, 非常感谢,我调整了Halcogen中的设置之后spi已经可以正常发送数据了 此外,我关于i2c的问题其实比较简单,是这样的,在i2c.c中,有一个i2cSetSlaveAdd()函数,我了解到这个函数是用于设置从机地址的 我的目的是要像一块具有7位地址0x48的从机发送一组读写命令, 而按照i2c的协议,在i2c发送的数据中,读写标志位是在八位地址之后的一位 我没有在i2c.c中找到具体的设置是读还是写的函数,那么是否可以理解为i2cSetSlaveAdd()所设置的从机地址,实际上是包含了读写位的八位地址呢? 还是说,有另外的办法来设置是读还是写? 谢谢~ |
|
|
|
anythink 发表于 2018-5-22 07:33 Yinan, 一般情况下 I2c的从芯片,都会有自己的advie address设置,通常是前7位是和地址有关系的,然后最后1位,1代表read,0代表write。 你可以仔细查看你的产品手册 谢谢 BR, KEN |
|
|
|
lining870815844 发表于 2018-5-22 07:43 Ken, 你好, 非常感谢你的解答,也就是说,当我想向具有7位地址0x48的从芯片做写入操作时,我应当把它的地址视为0x90,而引用i2cSetSlaveAdd(i2cREG1,0x90)对吗? 我按照上面的思路并仿照Halcogen给的loopback模式例程写了以下的小程序,其中0x03代表寄存器地址,0x01代表写入值 while(1) [ i2cInit(); i2cSetOwnAdd(i2cREG1,own_add); i2cSetStart(i2cREG1); i2cSetSlaveAdd(i2cREG1,0x90); /**/ i2cSendByte(i2cREG1,0x03); /*寄存器寻址*/ i2cSendByte(i2cREG1,0x01); /*对寄存器写入数据*/ wait(0xffff); i2cClearSCD(i2cREG1); ] 但是示波器显示在一次循环中的SCL和SDA时序图一共只有八个时钟周期的图像,也就是像下图这样 我的理解是似乎整个程序中只有i2cSetStart()起作用了,后续的设置从机地址以及向从机发送命令的程序都没有发挥作用, 不知道是不是程序本身的问题,希望您能帮我看一下 多谢~ |
|
|
|
lining870815844 发表于 2018-5-22 07:43 Ken, 你好,这个问题我已经自己摸索解决了, 谢谢你! |
|
|
|
Yinan, 不好意思,没来得及帮你看下问题。很高兴看见你自己解决了问题。 可以的话,能都告知你是怎么解决的,这样也方便其他的知道。 谢谢 BR, KEN |
|
|
|
ken, 你好,这个问题还是源于我对i2cSetSlavAdd()函数的错误理解 我最终调通的程序是这样的 i2cInit(); sciInit(); i2cSetOwnAdd(i2cREG1,own_add); i2cSetStart(i2cREG1); i2cSetSlaveAdd(i2cREG1,0x48); i2cSendByte(i2cREG1,0x90); /* ·¢ËÍдÊý¾ÝÃüÁҪдÈëµÄÊý¾Ý */ i2cSendByte(i2cREG1,0x0B); /* ·¢ËÍдÊý¾ÝÃüÁҪдÈëµÄÊý¾Ý */ i2cSetStart(i2cREG1); i2cSetDirection(i2cREG1, I2C_RECEIVER); a=i2cReceiveByte(i2cREG1); sciSendByte(scilinREG,a); 相比于之前,改动主要有以下几点 1,i2cSetSlaveAdd中所设置的从机地址是不带第八位(读写标志位)的,即0x48,发布写命令时才需要在七位地址后加上0,变为0x90 2, 在对地址寄存器写入对应的寄存器地址(0x0B)后,要读取这个寄存器的值,只需要调用i2cSetDirection(i2cREG1, I2C_RECEIVER),将主机设置为receiver模式,主机就会自动向从机发送一个读命令(i2cSendByte(i2cREG1,0x91),这时从机就会把反馈发送到DXR,调用i2cReceiveByte()即可取走 现在对于单一字节寄存器读写都没有问题了,不过现在还有一些缺陷,对于多个地址连续的寄存器,如何实现块读取?我阅读过从芯片的datasheet,上面说的是支持块读取的,但是我发现调用i2cSetDirection(i2cREG1, I2C_RECEIVER)之后芯片只能返回一个字节的数据,我不知道该怎么做才能实现寄存器地址的自动递增,能否请您指点一下? 谢谢 |
|
|
|
只有小组成员才能发言,加入小组>>
336 浏览 1 评论
529 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
774 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
651 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1130 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
58浏览 29评论
146浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
252浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
202浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
57浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 12:38 , Processed in 0.734625 second(s), Total 89, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号