I2C只接收64个字节

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
2个帖子/ 0新
最后一篇
玛克
离线
最后一次露面:11个月3周前
加入:2016-03-31 11:58
I2C只接收64个字节

你好,
我们正在使用DA14580 IC进行蓝牙开发。我们使用I2C在外部微控制器上连接相同。DA14580作为主服务器,它从移动应用程序收到250个字节,并将它们发送到外部微控制器。控制器处理数据并以响应生成250字节数据。控制器将数据发送回DA14580,但DA14580只接收64个字节。附加I2C init,读写的代码

#define i2c_buffer_len 250.
#define i2c0 5.
#define scc_i2c_timeout 0xffff.
#define scc_init_value 0x00.
#define scc_i2c_bus_write_array_index 0x00.

void ble_i2c_init(uint16_t dev_address,uint8_t速度,uint8_t地址_mode)
{
setbits16(clk_per_reg,i2c_enable,1);//为i2c启用时钟
setword16(i2c_enable_reg,0x0);//禁用I2C控制器
setword16(i2c_con_reg,i2c_master_mode | i2c_slave_disable | i2c_restart_en);//从站被禁用
setBits16(i2c_con_reg,i2c_speed,speed);//设置速度
setbits16(i2c_con_reg,i2c_10bitaddr_master,address_mode);//设置寻址模式
setword16(i2c_tar_reg,dev_address&0xff);//设置从设备地址
setword16(i2c_enable_reg,0x1);//启用I2C控制器
而(getword16(i2c_status_reg)&0x20);//等待I2C主FSM闲置
}

INT8_T SCC_I2C_BUS_WRITE(UINT8_T DEV_ADDR,UINT8_T * REG_DATA,UINT8_T计数)
{

uint32_t scc_i2c_timeout = scc_i2c_timeout;
Int32_t scc_ierror = scc_init_value;
// uint8_t array [i2c_buffer_len];
uint8_t stringpos = scc_init_value;
setword16(i2c_enable_reg,0x0);
setword16(i2c_tar_reg,dev_addr&0xff);//设置从设备地址
setword16(i2c_enable_reg,0x1);
timeout_wait_until_i2c_fifo_is_empty(scc_i2c_timeout);
for(stringpos = scc_init_value; stringpos send_i2c_command(reg_data [stringpos]);
timeout_wait_until_i2c_fifo_is_empty(scc_i2c_timeout);//等待i2c tx fifo已满
}
timeout_wait_until_no_master_activity(scc_i2c_timeout);//等到没有主活动

返回(Int8_t)scc_ierror;
}

INT8_T SCC_I2C_BUS_READ(UINT8_T DEV_ADDR,UINT8_T REG_ADDR,UINT8_T * REG_DATA,UINT8_T CNT)
{
uint32_t scc_i2c_timeout = scc_i2c_timeout;
Int32_t scc_ierror = scc_init_value;
uint8_t array [i2c_buffer_len] = {scc_init_value};
uint8_t stringpos = scc_init_value;

数组[scc_init_value] = reg_addr;

setword16(i2c_enable_reg,0x0);
setword16(i2c_tar_reg,dev_addr&0xff);//设置从设备地址
setword16(i2c_enable_reg,0x1);

timeout_wait_until_i2c_fifo_is_empty(scc_i2c_timeout);
for(stringpos = 0; stringpos timeout_wait_whille_i2c_fifo_is_full(scc_i2c_timeout);//等待TX FIFO已满
send_i2c_command(0x0100);//设置次次读取访问
}
//关键部分
global_int_disable();

//获取收到的数据
for(stringpos = 0; stringpos timeout_wait_for_received_byte(scc_i2c_timeout);//等待收到的数据
数组[stringpos] =(0xff&getword16(i2c_data_cmd_reg);//获取收到的字节
}
//关键部分结束
global_int_restore();
for(stringpos = scc_init_value; stringpos

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

嗨mayank,

由于主站是580,那么这是提供时钟的设备,以便从设备读取数据,因此如果设备实际上产生适当的时钟周期,请通过分析器检查,以便从中读取250个字节外部设备。每个send_i2c_command()生成时钟,以便设备从外部设备读取一个字节,因此,只要我能从代码中理解,您可以在第一个()中的所有代码中发送250读命令循环(timeout_wait_whille_i2c_fifo_is_full对应于wait_while_i2c_fifo_is_full宏),然后您尝试从I2C的FIFO读取250个字节,但I2C的FIFO只有32字节深,所以显然您只读了两组完整的FIFO。请检查SDK中的I2C_EEPROM示例,并检查代码如何访问每个读取32字节的内存设备读取块,以便在256字节的总数据中进行I2C FIFO的限制。

谢谢mt_dialog.