cypress,您好!
我在用cy8c6347芯片的时候。 想使用硬件I2C作为主机。 跟一个芯片进行通讯。 我这边首先使用例程CE220818_I2C_Master_Low_Level01.cydsn。 但是我这边用硬件仿真死在了读取部分。 跳转到了
我有参考PSoC6_Interfacing_BMI160(I2C)_FreeRTOS01例子当中的
程序依然会停止在上图的位置。 我跟踪发现好像是
CY_ASSERT_L2(CY_SCB_IS_I2C_ADDR_VALID (xferConfig->slaveAddress));
这里出了问题。 我发现这个地址在程序预处理的时候&0x80来判别。 但是我的从机地址是0xA0, 二进制1010 0000 。
#define CY_SCB_IS_I2C_ADDR_VALID(addr) ( (0U == ((addr) & 0x80U)) )
这个地方过不去。 我查了这个例子,bmi160的从机地址是1101 0000。 也是最高位为1的。
能给一个bim160例子中不跑RTOS的例子吗。 我没有找到这个例子i2c初始化部分。 只看到了读写函数。 谢谢!
已解决! 转到解答。
我看了下PSoC6_Interfacing_BMI160这个例子,其中从设备bmi160地址 - BMI160_I2C_ADDR 为0x68,PSoC 6的I2C从设备地址是7bit寻址,你的从机地址看上去是8bit,所以导致问题产生。
我使用中断方式的I2c例子测试。 调通了。 但是我发现我在调试i2c, spi接口的时候,遇到同样的问题,就是中断方式可以,轮训方式的例子调试不通。
我看了下PSoC6_Interfacing_BMI160这个例子,其中从设备bmi160地址 - BMI160_I2C_ADDR 为0x68,PSoC 6的I2C从设备地址是7bit寻址,你的从机地址看上去是8bit,所以导致问题产生。
我现在遇到一个问题。 就是我想把P去掉。 箭头所示。 我读取I2c的方式是先写地址, 然后在读。 但是我不知道如何在写+读中间去掉P,因为芯片厂家说如果逻辑不严格,可能会有问题。 我试了我确实遇到了读取数据不对的情况。
你这边是从机接受stop位有出现什么问题吗?是否发送stop位在主机这边是可以选择的,Low Level代码中有专门发送Stop bit的API,如果不需要可以删除,High Level代码中通过API - Cy_SCB_I2C_MasterWrite中参数xferConfig -> xferPending决定是否发送stop bit.