I2C能在DA1469x SNC上突发读取吗?
DA1469x
4个月前
I2C能在DA1469x SNC上突发读取吗?
发布的SEOF200020分 8回答说你好
我想在DA1469x + sensor环境中通过SNC读取传感器信息。
通过SNC读取2个字节是成功的。
然而,当读取传感器的fifo时,它似乎不能正确读取。
(当读取一次时,尝试从最小56字节读取到最大2800字节)
用示波器观察波形,似乎传感器侧正在向da1469x发送fifo数据。
I2C能在DA1469x SNC上突发读取吗?
在SNC中对i2c通信有什么限制吗?
有snc i2c脉冲读取的例子吗?
我使用SDK_10.0.10.118
请告诉我。
谢谢你!
4个月前
嗨
我通过参考教程写了它。
为了通过SNC的i2c读取传感器的芯片ID,我验证了我使用SNC_i2c_write()和SNC_i2c_read()读取芯片ID。
然而,当从传感器读取fifo数据时,它只读取了错误的值。当读取fifo数据从示波器,它看起来像是数据正在传输从传感器。
另外,在不使用SNC的模式下,通过i2c通信读取传感器的fifo数据来读取有效值。
我附加i2c格式和当前与传感器通信时使用的部分代码。
如果有什么问题,请告诉我。
/***************************************************************************/
_snc_retated静态uint32_t cmd_arry [5] = {0};
_SNC_RETAINED static uint32_t * p_cmd_array = & cmd_array [0];
_SNC_RETAINED static uint32_t snc_rxbuf[10] = {0};
snc_retained static uint32_t * snc_rxbuf = &snc_rxbuf[0];
_SNC_RETAINED static uint32_t snc_fifo[2048] = {0};
_SNC_RETAINED static uint32_t *snc_p_fifo = &snc_fifo[0];
......
空白init_snc(空白)
{
......
cfg。pdc_evt_pr = AD_SNC_PDC_EVT_PR_0;
cfg。ucode_pr = AD_SNC_UCODE_PR_1;
cfg。cb = _snc_read_cb;
cfg。HW_PDC_TRIG_SELECT_MASTER, hw_pdc_peri_trig_id_masteronly,
HW_PDC_MASTER_SNC,
Hw_pdc_lut_entry_en_xtal | hw_pdc_lut_entry_en_com |
hw_pdc_lut_entry_en_per |hw_pdc_lut_entry_en_tmr);
UCode_CTX = SNC_UCODE_CTX(UCODE_SNC_COLLECT_SAMPLES);
ucode_snc_init ();
Ucode_id = ad_snc_ucode_register(&cfg, ucode_ctx);
ad_snc_ucode_enable (ucode_id);
ad_snc_pdc_set_pending (snc_ucode_id);
}
SNC_UCODE_BLOCK_DEF (ucode_snc_collect_samples) {
......
/*读取芯片id从传感器*/
/ * write addr,idexs * /
SENIS_assign (da (&p_cmd_arry) &cmd_arry [0]);
SNC_i2c_open (I2C_DEV);
SENIS_assign (da (&cmd_arry [0]), 0 x41);
SENIS_assign (da (&cmd_arry [1]), 0 x00);
senis_assign(da(&cmd_arry [2]),0xff);
snc_mutex_lock(&snc_mutex);
i2c_write(I2C_DEV, ia(& p_cmd_array), 3, SNC_HW_I2C_FLAG_ADD_STOP);
SNC_MUTEX_UNLOCK (&snc_mutex);
snc_i2c_close(i2c_dev);
SENIS_del_ms (wait_delay);
/*读取芯片id */
SENIS_assign (da (&snc_p_rxbuf) &snc_rxbuf [0]);
SNC_i2c_open (I2C_DEV);
snc_mutex_lock(&snc_mutex);
SNC_i2c_read(I2C_DEV, ia(&snc_p_rxbuf), 2, SNC_HW_I2C_FLAG_ADD_STOP);
SNC_MUTEX_UNLOCK (&snc_mutex);
snc_i2c_close(i2c_dev);
......
/ *从传感器读取FIFO数据* /
/ * write addr,idexs * /
SENIS_assign (da (&p_cmd_arry) &cmd_arry [0]);
SNC_i2c_open (I2C_DEV);
SENIS_assign (da (&cmd_arry [0]), 0 x12);
SENIS_assign (da (&cmd_arry [1]), 0 x01);
snc_mutex_lock(&snc_mutex);
SNC_i2c_write(I2C_DEV, ia(&p_cmd_arry), 2, SNC_HW_I2C_FLAG_ADD_STOP);
SNC_MUTEX_UNLOCK (&snc_mutex);
snc_i2c_close(i2c_dev);
SENIS_del_ms (wait_delay);
/*读取芯片id */
SENIS_assign (da (&snc_p_fifo) &snc_fifo [0]);
SNC_i2c_open (I2C_DEV);
snc_mutex_lock(&snc_mutex);
snc_i2c_read(i2c_dev,ia(&snc_p_fifo),da(&len),snc_hw_i2c_flag_add_stop);// len == 56〜2700
SNC_MUTEX_UNLOCK (&snc_mutex);
snc_i2c_close(i2c_dev);
......
}
/*从SNC获取rx, fifo数据*/
void get_snc_data(uint32_t * rxbuf,uint32_t * fifo)
{
snc_mutex_SNC_lock (&snc_mutex);
memcpy (rxbuf snc_rxbuf, sizeof (snc_rxbuf));
Memcpy (fifo, snc_fifo, sizeof(uint32_t) * len);// len == 56~2700
snc_mutex_SNC_unlock (&snc_mutex);
}
/***************************************************************************/
谢谢你!
附件 | 大小 |
---|---|
i2c_format.zip | 538.3 KB. |
3个月前
嗨SEOF2000,
抱歉我回复晚了。SNC支持I2C突发读和写,只要传感器执行自动增量。
你能探测I2C信号并提供一个逻辑分析仪捕获吗?我们想检查在通过SNC和CM33执行I2C突发读取期间发生了什么,以及通过代码读取的值的数据。
还请突出显示错误数据读取的模式。
谢谢,PM_Dialog
2个月前
嗨seof2000
我想让你知道,我们在Github上发布了一些代码。所有SDK10的例子和闪存驱动器都可以在这里找到:
https://github.com/dialog-semiconductor/BLE_SDK10_examples
谢谢,PM_Dialog
4个月前
嗨SEOF2000,
谢谢你在网上提出的问题。你能看看我们的吗DA1469x I2C传感器节点控制器模板从DA1469x支持网站的SW例子?你遵循了这个教程吗?
在da1469x_snc_i2c_template_sample_code\doc路径下有一个Readme文件。
关于爆炸,让我查一下。
谢谢,PM_Dialog