你好,
我正在尝试使用来自加速度计的I2C读取30个字节。大多数时间它工作但偶尔,大师(DA14580)发出停止,搞定后续数据。我正在使用I2C EEPROM模块中的代码来进行突发读取。
我应该看什么是有什么明显的?
谢谢,马可
嗨marcodg,
您的描述非常通用,所以请您提供更多信息,为什么您的代码停止意外工作以指导您?您是否尝试在调试模式下运行代码并热连接调试器?您可以澄清代码崩溃的地方吗?NMI处理程序或WDOG命中吗?或者您的代码在您尝试从加速度计读取字节时崩溃了?
谢谢,PM_DIALOG.
问题似乎是读取数据的原子。在i2c_eeprom.c中我看到了以下内容
// -----------------------------------------------------------------------------------------------------------//关键部分global_int_disable();//获取收到的数据for(j = 0; j {wait_for_received_byte();//等待收到的数据** p =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节(* p)++;}//关键部分结束global_int_restore();// -----------------------------------------------------------------------------------------------------------
我有相同的代码阅读加速度计。问题是,我必须包括将地址和写入所有读取命令的写入相同的关键部分来包含,以使其工作。像这样:
// -----------------------------------------------------------------------------------------------------------//关键部分global_int_disable();i2c_send_address(地址);for(j = 0; j {等待_while_i2c_fifo_is_full();//等待TX FIFO已满send_i2c_command(0x0100);//设置次次读取访问}//获取收到的数据for(j = 0; j {wait_for_received_byte();//等待收到的数据** p =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节(* p)++;}//关键部分结束global_int_restore();// -----------------------------------------------------------------------------------------------------------
我不确定为什么需要一个关键部分,因为它似乎一旦I2C状态机正在运行,它就会在它自己的情况下运行,而没有通过程序进行干预。但是,很明显,如果我不这样做,那么生成偶尔会产生不正确的停止,弄乱数据传输。也许这只是我们使用的加速度计(MMA845IQ)的问题。具有这样一个大的关键部分导致其他问题。
当发生数据的实际接收时,我们禁用/恢复中断。这是一种保护,以确保将数据放入FIFO时不会发生中断。请注意,当FIFO为空时,您会得到一个停止,它没有其他数据。因此,如果您解开此接收过程并引起中断,您将停止将数据放入FIFO,FIFO将为空,您将停止。关键部分是将数据放入FIFO时,而FIFO推动数据时。因此,在收到数据时请不要删除禁用/恢复中断。
嗨marcodg,
您的描述非常通用,所以请您提供更多信息,为什么您的代码停止意外工作以指导您?您是否尝试在调试模式下运行代码并热连接调试器?您可以澄清代码崩溃的地方吗?NMI处理程序或WDOG命中吗?或者您的代码在您尝试从加速度计读取字节时崩溃了?
谢谢,PM_DIALOG.
问题似乎是读取数据的原子。在i2c_eeprom.c中我看到了以下内容
// -----------------------------------------------------------------------------------------------------------
//关键部分
global_int_disable();
//获取收到的数据
for(j = 0; j
wait_for_received_byte();//等待收到的数据
** p =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节
(* p)++;
}
//关键部分结束
global_int_restore();
// -----------------------------------------------------------------------------------------------------------
我有相同的代码阅读加速度计。问题是,我必须包括将地址和写入所有读取命令的写入相同的关键部分来包含,以使其工作。像这样:
// -----------------------------------------------------------------------------------------------------------
//关键部分
global_int_disable();
i2c_send_address(地址);
for(j = 0; j
等待_while_i2c_fifo_is_full();//等待TX FIFO已满
send_i2c_command(0x0100);//设置次次读取访问
}
//获取收到的数据
for(j = 0; j
wait_for_received_byte();//等待收到的数据
** p =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节
(* p)++;
}
//关键部分结束
global_int_restore();
// -----------------------------------------------------------------------------------------------------------
我不确定为什么需要一个关键部分,因为它似乎一旦I2C状态机正在运行,它就会在它自己的情况下运行,而没有通过程序进行干预。但是,很明显,如果我不这样做,那么生成偶尔会产生不正确的停止,弄乱数据传输。也许这只是我们使用的加速度计(MMA845IQ)的问题。具有这样一个大的关键部分导致其他问题。
嗨marcodg,
当发生数据的实际接收时,我们禁用/恢复中断。这是一种保护,以确保将数据放入FIFO时不会发生中断。请注意,当FIFO为空时,您会得到一个停止,它没有其他数据。因此,如果您解开此接收过程并引起中断,您将停止将数据放入FIFO,FIFO将为空,您将停止。关键部分是将数据放入FIFO时,而FIFO推动数据时。因此,在收到数据时请不要删除禁用/恢复中断。
谢谢,PM_DIALOG.