嗨,对话
问题:
我发现一个问题是,当我使用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信号波形。
谢谢金克
设备:
嗨金麦,
如果在存在持续的I2C事务时发生BLE中断,则BLE中断具有更高的优先级,并且将中断I2C事务,因此模块将在I2C总线上发出停止。正确的方法是使用DMA而不是直接使用I2C模块。所以你使用DMA吗?
谢谢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;
那么,如何启用大坝?
嗨金麦,
要使用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.
嗨,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问题。
谢谢 !
数据缓冲区元素为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);
}