IIC和BLE的冲突

6个帖子/ 0新
最后一篇
特克克
离线
最后一次露面:11个月3周前
加入:2016-12-08 09:21
IIC和BLE的冲突

Hi,dialog

问题:
I found a problem that when i use the IIC api ad_i2c_async_transact to write data (5 * 128byte) to the OLED display, there will lost some data . The IIC was change the state to "STOP" when the data haven't been completly transfer finished. if i turn off the ble advertise, the oled works well.

项目设置:
1,项目使用:PXP_Reporter的DA1468x_sdk_btle_v_1.0.6.968;
2,BLE设置为默认值;
3,IIC快速速度 - 400kHz;

想要konw:
1,BLE如何影响IIC传输或我的IIC配置有问题
2,以什么方式IIC和BLE都很好地运行。

附件显示在编写OLED时的IIC信号波形。

谢谢金克

附件:
设备:
mt_dialog.
离线
最后一次露面:2个月1周前
职员
加入:2015-06-08 11:34
嗨金麦,

嗨金麦,

如果在存在持续的I2C事务时发生BLE中断,则BLE中断具有更高的优先级,并且将中断I2C事务,因此模块将在I2C总线上发出停止。正确的方法是使用DMA而不是直接使用I2C模块。所以你使用DMA吗?

谢谢mt_dialog.

特克克
离线
最后一次露面:11个月3周前
加入:2016-12-08 09:21
嗨mt_dialog,

嗨mt_dialog,

我设置了使用DMA的IIC,但它是DOSEN; T在DMA模式下工作。

首先,我将IIC配置为i2c_slave_device_dma(i2c2,ssd1306,0x3c,hw_i2c_addressing_7b,hw_i2c_speed_fast,2);

if it's ok for the iic to use the dam channel or there still something i have to do to enable the dma?

然后使用HW_I2C_WRITE_BUFFER_DMA_EX();发送数据。

我打印了设备 - > dma_channel,值为-1;

那么,如何启用大坝?

mt_dialog.
离线
最后一次露面:2个月1周前
职员
加入:2015-06-08 11:34
嗨金麦,

嗨金麦,

要使用DMA,您只需在platform_devices.h文件中配置您的设备,如下所示:

i2c_slave_device_dma(i2c1,mpu_6050,0x68,hw_i2c_addressing_7b,hw_i2c_speed_standard,2);

另外请使用适配器才能与I2C和DMA交互,而不是直接HW驱动器,如下面的示例,

i2c_device your_device_handle;

your_device_handle = ad_i2c_open (YOUR_DEVICE_NAME);

ad_i2c_transact(your_device_handle, i2c_internal_register, write_length, read_buffer, read_length);

ad_i2c_close(your_device_handle)

您还可以查看PerInireve_Demo项目,以检查适配器如何与DMA一起使用,以及适配器部分中的DOXYGEN文档。

谢谢mt_dialog.

特克克
离线
最后一次露面:11个月3周前
加入:2016-12-08 09:21
嗨,mt_dialog

嗨,mt_dialog
我有测试你所说的内容,我发现AD_I2C_TRANSACT只有在接收模式中的大坝,如果我想写数据,它会使用
os_enter_critical_section();
os_leave_critical_section();
为了避免另一种话题的分心,但不使用我需要的大坝。但事实上,当数据未完成时,IIC仍然停止。
我不知道我是否没有以正确的方式使用它,你能给我一些建议吗?

我使用ad_i2c_async_transact(),这个函数只有与DMA的接收模式,我自己添加了写模式......但我遇到了一些问题:

我试着用这种方式使用水坝:

SSD1306_DEV = AD_I2C_OPEN(SSD1306);
AD_I2C_ASYNC_TRANSACT(SSD1306_DEV,I2C_SND(&register_addr,1),
i2c_snd_st(register_data,wr_len),
I2C_CB1(SSD1306_DONE_CB,&ERROR),
I2C_END);
ad_i2c_close(ssd1306_dev);
; ******************************************************************************
void ad_i2c_async_transact(i2c_device dev,...)
{
...some code here.....
ad_i2c_async_do(dev,0);
}
; ******************************************************************************
静态void ad_i2c_async_do(i2c_device dev,hw_i2c_abort_source错误)
{
...some code here.....

案例I2C_TAG_SEND:
/* start write operation, next action executes from interrupt */
len =(uint16_t)数据 - >事务[data-> transaction_ix ++];
wbuf =(const uint8_t *)数据 - >事务[data-> transaction_ix ++];

if(设备 - > dma_channel <0){
HW_I2C_WRITE_BUFFER_ASYNC(设备 - > BUS_ID,WBUF,LEN,AD_I2C_CB,设备,HW_I2C_F_NONE);
} 别的 {
hw_i2c_write_buffer_dma_ex(device-> bus_id,
(UINT8_T)设备 - > DMA_CHANNEL,WBUF,LEN,
ad_i2c_dma_cb,设备,hw_i2c_f_none);//这是我添加的代码,以便在DMA模式下发送数据
}
返回;
}

之后 :
在这段时间内,IIC正在进行我在调试模式中知道的大坝模式。IIC序列是写入 - > slave_address +目的地地址+数据(128byte)
但我找到了目的地地址Alwasy 0x00;和slave_address和数据是正确的;我不konw为什么硬件iic将目的地地址设置为零;
我有这个问题的调试,但我找不到问题所在的位置?

附件显示了IIC问题。

谢谢 !

附件:
歌曲
离线
最后一次露面:6个月2周前
加入:2016-04-14 09:49
1、

数据缓冲区元素为16位宽,此高字节应为0,用于写入并在读取时丢弃。

/* my code */
静态os_event i2c_event;
静态易失性hw_i2c_abort_source i2c_err;

...some code here.....

static void i2c_init(void)
{
os_event_create(i2c_event);
}

...some code here.....

静态void i2c_wr(void)
{
i2c_device dev;
uint16_t wbuf [2] = {0x00,0xae};

dev = ad_i2c_open(my_device);

ad_i2c_async_write(dev,wbuf,sizeof(wbuf)/ sizeof(uint16_t),i2c_wr_cb,null);
OS_EVENT_WAIT(i2c_event, OS_EVENT_FOREVER);
assert_error(i2c_err == hw_i2c_abort_none);

ad_i2c_close(dev);
}

static void i2c_wr_cb(void *user_data, HW_I2C_ABORT_SOURCE error)
{
i2c_err =错误;
OS_EVENT_SIGNAL_FROM_ISR(I2C_EVENT);
}