你好,
我们正在使用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
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
send_i2c_command(0x0100);//设置次次读取访问
}
//关键部分
global_int_disable();
//获取收到的数据
for(stringpos = 0; stringpos
数组[stringpos] =(0xff&getword16(i2c_data_cmd_reg);//获取收到的字节
}
//关键部分结束
global_int_restore();
for(stringpos = scc_init_value; stringpos
嗨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.