跳到主要内容

可以在DA1469x SNC上读取I2C突发吗?

da1469x.

4个月前

可以在DA1469x SNC上读取I2C突发吗?

张贴了seof200020分 8回复
0旋转

你好
我想通过DA1469X +传感器环境中的SNC读取传感器信息。

通过SNC读取2个字节成功。
但是,在读取传感器的FIFO时,它似乎没有正确读取。
(在阅读一次时,它会尝试从最小56字节读取到最大2800字节)

使用示波器查看波形,看起来传感器侧将FIFO数据发送到DA1469x。

可以在DA1469x SNC上读取I2C突发吗?
SNC中的I2C通信是否有任何限制?
是否有任何SNC I2C突发读取示例?

我使用SDK_10.0.10.118.

请告诉我。

谢谢你。

4个月前

PM_DIALOG.

嗨seof2000,

谢谢你的问题在线。你能查看我们的传感器节点控制器DA1469X I2C模板SW示例来自DA1469X支持网站?你遵循这个教程吗?

在da1469x_snc_i2c_template_sample_code \ doc路径中有一个自述文件文件。

关于突发阅读,让我检查一下。

谢谢,PM_DIALOG.

4个月前

seof2000 20分

你好

我是参考教程编写的。

要通过SNC的I2C读取传感器的芯片ID,我验证了我使用snc_i2c_write()和snc_i2c_read()来读取芯片ID。

但是,在从传感器读取FIFO数据时,它只读取错误的值。当从示波器读取FIFO数据时,它看起来像从传感器传输数据。

另外,在未使用SNC的模式中,通过I2C通信读取传感器的FIFO数据来读取有效值。

我附上I2C格式,并在与传感器通信时当前使用的代码的一部分。
如果有什么问题,请告诉我。

/ **************************************************************************** /
_SNC_RETAINED static uint32_t cmd_arry[5] = {0};
_snc_retated静态uint32_t * p_cmd_arry =&cmd_arry [0];

_snc_retated静态uint32_t snc_rxbuf [10] = {0};
_snc_retated静态uint32_t * snc_p_rxbuf =&snc_rxbuf [0];

_snc_retated静态uint32_t snc_fifo [2048] = {0};
_snc_retated静态uint32_t * snc_p_fifo =&snc_fifo [0];

......

void init_snc(void)
{
......
cfg.pdc_evt_pr = ad_snc_pdc_evt_pr_0;
cfg.ucode_pr = ad_snc_ucode_pr_1;
cfg.cb = _snc_read_cb;

cfg.pdc_entry = hw_pdc_lut_entry_val(hw_pdc_trig_select_master,hw_pdc_periph_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_udode_register(&cfg,ucode_ctx);
ad_snc_udode_enable(ucode_id);

ad_snc_pdc_set_pending(snc_ucode_id);
}

snc_udode_block_def(Ucode_snc_collect_samples){
......

/ *从传感器读取芯片ID * /
/* write addr, idxs */
senis_assign(da(&p_cmd_arry),&cmd_arry [0]);
snc_i2c_open(i2c_dev);
senis_assign(da(&cmd_arry [0]),0x41);
senis_assign(da(&cmd_arry [1]),0x00);
SENIS_assign (da (&cmd_arry [2]), 0 xff);
SNC_MUTEX_LOCK (&snc_mutex);
snc_i2c_write(i2c_dev,ia(&p_cmd_arry),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, idxs */
senis_assign(da(&p_cmd_arry),&cmd_arry [0]);
snc_i2c_open(i2c_dev);
senis_assign(da(&cmd_arry [0]),0x12);
senis_assign(da(&cmd_arry [1]),0x01);
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

4个月前

seof2000 20分

你好

另外,I2C可以在DA1469X SNC上进行写入吗?

请告诉我。

谢谢你。

4个月前

PM_DIALOG.

嗨seof2000,

让我检查一下,我会回复你。

谢谢,PM_DIALOG.

3个月前

PM_DIALOG.

嗨seof2000,

我在内部升级了你的票证来检查出来。我会尽快回复你。

谢谢,PM_DIALOG.

3个月前

PM_DIALOG.

嗨seof2000,

为我迟到的回复道歉。SNC支持两个I2C突发读写,所以传感器执行自动增量。

您可以探讨I2C信号并提供逻辑分析仪捕获吗?当通过SNC和CM33执行时,我们想检查I2C突发期间发生的情况以及使用代码读取的值的数据。

请突出显示错误数据的模式。

谢谢,PM_DIALOG.

接受答案!

2个月前

PM_DIALOG.

嗨SEOF2000

我想让你知道我们在GitHub上发布了一些代码。此处提供所有SDK10示例和闪存驱动程序:

https://github.com/dialog-semiconductor/ble_sdk10_examples.

谢谢,PM_DIALOG.

2个月前

seof2000 20分

你好,

谢谢您的支持。

这个问题被认为是因为我们的传感器初始化过程没有正常执行。

谢谢你