在CC2640中,是否应该为每个i2c从机建立单独的任务
我使用的事2640
在HIDEmuKbd工程中仿写了sensorTag的I2C驱动,并在该总线上挂了2个从机(一个滑鼠,一个加速度计)
然后我在Task中创建2个事件来获取2个从机的数据,代码如下:
if( events & PAW3003_EVT ) //PAW3003 { events &= ~PAW3003_EVT; Util_startClock(&paw3003Clock); if(taskbma250 == 0) { Util_startClock(&bma250eClock); //开启BMA250E事件; taskbma250 = 1; } PAW3003_Handle(); } if( events & BMA250E_EVT ) //BMA250 { taskbma250 = 0; events &= ~BMA250E_EVT; BMA250E_Handle(); }
但是程序会直接卡死,单个I2C从机通信都正常。
请问是否每个从机都必须单独建立一个任务?
有追踪过卡在哪句代码上吗?
蓝牙低功耗关闭了没有?
没有单步仿真去调试,就是2个I2C设备读取数值刷新不正常了。
没有,问题已经解决了
我分享下思路:
因为2个I2C设备共用了1个I2C的端口(I2C_INTERFACE_SDA0),在选择通信接口时,存在1个设备使用导致另一个设备阻塞的情况。
我在移植SensorTag工程的I2C代码中找到了一行代码: if (!Semaphore_pend(Semaphore_handle(&mutex),MS_2_TICKS(I2C_TIMEOUT)))
这行代码是用来查看当前I2C总线状态的,第二个参数默认是2500,我猜测是每个设备会独自占用2500ms。我把这个时间改成200之后2个I2C的从机设备都可以正常工作不会冲突了。
另外,可以以事件的形式完成,也可以像SenserTag中一样,每个从机给一个Task。
没有,问题已经解决了
我分享下思路:
因为2个I2C设备共用了1个I2C的端口(I2C_INTERFACE_SDA0),在选择通信接口时,存在1个设备使用导致另一个设备阻塞的情况。
我在移植SensorTag工程的I2C代码中找到了一行代码: if (!Semaphore_pend(Semaphore_handle(&mutex),MS_2_TICKS(I2C_TIMEOUT)))
这行代码是用来查看当前I2C总线状态的,第二个参数默认是2500,我猜测是每个设备会独自占用2500ms。我把这个时间改成200之后2个I2C的从机设备都可以正常工作不会冲突了。
另外,可以以事件的形式完成,也可以像SenserTag中一样,每个从机给一个Task。
非常感谢分享经验