上图是我写的一段SPI测试程序,目的是用SPI向10片M25P64flash芯片发送读取ID的命令,再通过SPI总线把这些ID接收回来
片选用了gioA和gioB的一共10个接口,发送和接收调用了spi.c中的spiTransmitAndReceiveData()函数
程序最终没能实现预定功能,在单步调试的过程中,发现程序卡在spiTransmitAndReceiveData()函数中的
while((spi->FLG & 0x00000100U) != 0x00000100U)
{
} /* Wait */
我觉得可能的原因是在设置dataconfig_t存在错误,但我对dataconfig1_t的四个值得具体含义不太了解,所以也不知道怎么设置才是正确的,请诸位前辈帮我解答一下吧
多谢!
Yinan Xia:
回复 Ken Wang:
Ken,
非常感谢,我调整了Halcogen中的设置之后spi已经可以正常发送数据了
此外,我关于i2c的问题其实比较简单,是这样的,在i2c.c中,有一个i2cSetSlaveAdd()函数,我了解到这个函数是用于设置从机地址的
我的目的是要像一块具有7位地址0x48的从机发送一组读写命令,
而按照i2c的协议,在i2c发送的数据中,读写标志位是在八位地址之后的一位
我没有在i2c.c中找到具体的设置是读还是写的函数,那么是否可以理解为i2cSetSlaveAdd()所设置的从机地址,实际上是包含了读写位的八位地址呢?
还是说,有另外的办法来设置是读还是写?
谢谢~
Ken Wang:
回复 Yinan Xia:
Yinan,
一般情况下 I2c的从芯片,都会有自己的advie address设置,通常是前7位是和地址有关系的,然后最后1位,1代表read,0代表write。
你可以仔细查看你的产品手册
谢谢
Yinan Xia:
回复 Ken Wang:
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()起作用了,后续的设置从机地址以及向从机发送命令的程序都没有发挥作用,
不知道是不是程序本身的问题,希望您能帮我看一下
多谢~
Yinan Xia:
回复 Ken Wang:
Ken,
你好,这个问题我已经自己摸索解决了,
谢谢你!
Ken Wang:
回复 Yinan Xia:
Yinan,
不好意思,没来得及帮你看下问题。很高兴看见你自己解决了问题。
可以的话,能都告知你是怎么解决的,这样也方便其他的知道。
谢谢
Yinan Xia:
回复 Ken Wang:
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)之后芯片只能返回一个字节的数据,我不知道该怎么做才能实现寄存器地址的自动递增,能否请您指点一下?
谢谢
user5221174:
回复 Yinan Xia:
您好,我也遇到了同样的问题,请问您设置了Halcogen的哪里解决的那,谢谢了