目录
引言
前面已经介绍了使用SLogic Combo 8逻辑分析仪分析UART数据-CSDN博客。今天分享一下使用逻辑分析仪分析I2C数据。
硬件配置
我使用的硬件是前一段时间测试星闪技术使用的润和的W63E套件,有关内容可以参考星闪技术_神一样的老师的博客-CSDN博客。测试软件采用的是【星闪开发连载】WS63E模块实时显示当前环境温湿度_润和星闪-CSDN博客。硬件相关的知识参见vendor/HiHope_NearLink_DK_WS63E_V03/demo/environment · HiSpark/fbb_ws63 - 码云 - 开源中国
通过环境监测板原理图可以看出环境监测板板SDA与底板TX、SCL与底板RX。我将I2C的SCL引脚连接到分析仪的D0通道,SDA引脚连接到D1通道,如下图所示。
分析仪配置
分析仪的基本使用方法在使用SLogic Combo 8逻辑分析仪分析UART数据-CSDN博客已经介绍了。如果分析I2C数据点击顶部工具栏黄蓝波形图标,搜索I2C,双击选择第一项。
点击波形显示窗口新增的I2C通道的协议标签。点击新增的I2C协议标签,设置的SCL、SDA所在通道。
数据分析
为了确保抓到数据,将采样点数改为500M,然后点击run就可以抓到数据了。下面就是抓到的数据。
从图中可以看到AHT20传感器的地址是38,这个从程序中也可以看到。
#define AHT20_DEVICE_ADDR 0x38
接下来写入了ACH、33H和00H三个命令字。ACH是触发测量命令。这点从程序中也可以找到对应代码:
/**
* 传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。
* 若状态比特位[Bit7]为0代表数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。
**/
#define AHT20_CMD_TRIGGER 0xAC // 触发测量命令
#define AHT20_CMD_TRIGGER_ARG0 0x33
#define AHT20_CMD_TRIGGER_ARG1 0x00
// 发送 触发测量 命令,开始测量
uint32_t AHT20_StartMeasure(void)
{
uint8_t triggerCmd[] = {AHT20_CMD_TRIGGER, AHT20_CMD_TRIGGER_ARG0, AHT20_CMD_TRIGGER_ARG1};
return AHT20_Write(triggerCmd, sizeof(triggerCmd));
}
通过获取状态命令,共读到6个字节的数据,其中第一个是状态数据。对应的程序段落是:
// 接收测量结果,拼接转换为标准值
uint32_t AHT20_GetMeasureResult(float *temp, float *humi)
{
uint32_t retval = 0, i = 0;
if (temp == NULL || humi == NULL) {
return 0;
}
uint8_t buffer[AHT20_STATUS_RESPONSE_MAX] = {0};
memset_s(&buffer, sizeof(buffer), 0x0, sizeof(buffer));
retval = AHT20_Read(buffer, sizeof(buffer)); // recv status command result
if (retval != 0) {
return retval;
}
for (i = 0; aht20_status_busy(buffer[0]) && i < AHT20_MAX_RETRY; i++) {
osDelay(10);
retval = AHT20_Read(buffer, sizeof(buffer)); // recv status command result
if (retval != 0) {
return retval;
}
}
if (i >= AHT20_MAX_RETRY) {
printf("AHT20 device always busy!\r\n");
return 0;
}
uint32_t humiRaw = buffer[1];
humiRaw = (humiRaw << 8) | buffer[2]; // 左移8位或buff[2]得到数据,具体可以看芯片手册
humiRaw = (humiRaw << 4) | ((buffer[3] & 0xF0) >> 4); // 左移4位或buff[3]得到数据,具体可以看芯片手册
*humi = humiRaw / (float)AHT20_RESLUTION * 100; // 100量程
uint32_t tempRaw = buffer[3] & 0x0F;
tempRaw = (tempRaw << 8) | buffer[4]; /* 左移8位或buff[4]得到数据,具体可以看芯片手册 */
tempRaw = (tempRaw << 8) | buffer[5]; // 左移8位或buff[5]得到数据,具体可以看芯片手册
*temp = tempRaw / (float)AHT20_RESLUTION * 200 - 50; /* 200 50量程 */
return 0;
}
AHT20的数据格式如下图所示。完整的手册参考常见问题FAQ · Issue #I6WPSS · HiSpark/hi3861_hdu_iot_application - Gitee.com 里面的AHT20.pdf。6个字节中的第一个是状态,后面5个字节,温湿度各占一半。
操作视频
以上操作过程,可以参考我的B站视频:使用逻辑分析仪分析I2C协议——以AHT20温湿度传感器为例_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1m4UBYUEHE/?spm_id_from=333.1007.top_right_bar_window_dynamic.content.click
结语
逻辑分析仪对于硬件接口调试而言是不可缺少的工具,有了它可以轻松看到底层数据。