IIC和BLE的冲突

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

嗨,对话

问题:
我发现一个问题是,当我使用IIC API AD_I2C_ASYNC_TRANACT写入OLED显示时的数据(5 * 128byte)时,将丢失一些数据。当数据尚未完成转移完成时,IIC将状态更改为“停止”。如果我关闭BLE广告,OLED会很好地运行。

项目设置:
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个月5天前
职员
加入: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);

如果IIC可以使用DAM通道或者仍然可以做的事情来启用DMA是可以的?

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

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

那么,如何启用大坝?

mt_dialog.
离线
最后一次露面:2个月5天前
职员
加入: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,...)
{
...有一些代码.....
ad_i2c_async_do(dev,0);
}
; ******************************************************************************
静态void ad_i2c_async_do(i2c_device dev,hw_i2c_abort_source错误)
{
...有一些代码.....

案例I2C_TAG_SEND:
/ *开始写入操作,下一个操作从中断执行* /
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个月1周前
加入:2016-04-14 09:49
1,

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

/ *我的代码* /
静态os_event i2c_event;
静态易失性hw_i2c_abort_source i2c_err;

...有一些代码.....

静态void i2c_init(void)
{
os_event_create(i2c_event);
}

...有一些代码.....

静态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);
}

静态void i2c_wr_cb(void * user_data,hw_i2c_abort_source错误)
{
i2c_err =错误;
OS_EVENT_SIGNAL_FROM_ISR(I2C_EVENT);
}