xiashuang 发表于 2022-8-15 09:15

【先楫HPM6750测评】测试I2C与ADS1115通信

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; HPM6750有4个I2C,HPM6750EVKMINI排针引出了2个I2C,模块侧有上拉电阻,所以使用板子上的I2C0,但比较遗憾的是HPM6750的I2C最高速度只支持1000k,不知道以后会不会支持3.4M。</span></span></p>

<p></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; ADS1115是TI家的</span></span>兼容 I 2C 的 16 位高精度低功耗模数转换器 (ADC),I2C的最高速度是3.4M,本来想测一下3.4M的I2C,后来查看HPM6750的手册看不支持3.4M。</p>

<p></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 找了个ADS1115模块,连接杜邦线开干</span></span></p>

<p></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 主要程序如下:</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;1.初始化I2C,速度为1000K</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;init_i2c_pins(TEST_I2C);<br />
&nbsp; &nbsp; i2c_config_t configi;<br />
&nbsp; &nbsp; uint32_t freq;<br />
&nbsp; &nbsp; configi.i2c_mode = i2c_mode_fast_plus ;//i2c_mode_normal<br />
&nbsp; &nbsp; configi.is_10bit_addressing = false;<br />
&nbsp; &nbsp; freq = clock_get_frequency(TEST_I2C_CLOCK_NAME);<br />
&nbsp; &nbsp; stat = i2c_init_master(TEST_I2C, freq, &amp;configi);<br />
&nbsp; &nbsp; if (stat != status_success) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; return stat;<br />
&nbsp; &nbsp; }</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 2.定义I2C地址,因为我接线将ADS1115的ADDR直接接地,所以I2C地址为0x48</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;#define ADS1115_WRITE_ADDRESS &nbsp; &nbsp; &nbsp; &nbsp;(0x90&gt;&gt;1)//0x90<br />
&nbsp;&nbsp;&nbsp;&nbsp;#define ADS1115_READ_ADDRESS &nbsp; &nbsp; &nbsp; &nbsp; (0x90&gt;&gt;1)//0x91</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 3.配置寄存器</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;void ads1115_config_register(uint8_t pointADD,uint8_t configH,uint8_t configL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;uint8_t reg_data={pointADD,configH,configL};<br />
&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if (status_success != i2c_master_write(TEST_I2C, ADS1115_WRITE_ADDRESS, reg_data, 3)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;IIC write failed&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ads1115 Config Register error!!!\r\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;while (1) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 4.读数据</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">int16_t ads1115_read_data(void)<br />
{<br />
&nbsp; &nbsp; int16_t data;<br />
&nbsp; &nbsp; uint8_t rx_data={0};</span></span><br />
<span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; if (status_success != i2c_master_write(TEST_I2C, ADS1115_WRITE_ADDRESS, 0x00, 1)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;IIC write failed&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;ads1115 convert Register error!!!\r\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; while (1) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp;<br />
&nbsp; &nbsp; if (status_success != i2c_master_read(TEST_I2C, ADS1115_READ_ADDRESS, rx_data, 2)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;IIC read failed\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;ads1115 read data error!!!\r\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; while (1) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; data=rx_data&lt;&lt;8 | rx_data;<br />
&nbsp; &nbsp; return data;<br />
}</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 5.获取电压值</span></span></p>

<p>&nbsp;</p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">double ads1115_get_voltage_val(uint8_t pointADD,uint8_t configH,uint8_t configL)<br />
{<br />
&nbsp; &nbsp; double val;<br />
&nbsp; &nbsp; int16_t ad_val;</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; ads1115_config_register(pointADD,configH,configL);<br />
&nbsp; &nbsp; delay_ms(10);//等待10ms<br />
&nbsp; &nbsp; ad_val=ads1115_read_data();<br />
&nbsp; &nbsp; if((ad_val==0x7FFF)|(ad_val==0X8000))//是否超量程了<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; ad_val=0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;over PGA\r\n&quot;);<br />
&nbsp; &nbsp; }</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; switch((0x0E&amp;configH)&gt;&gt;1)//量程对应的分辨率<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; case(0x00):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val=(double)ad_val*187.5/1000000.0;//<br />
&nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; case(0x01):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val=(double)ad_val*125/1000000.0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; case(0x02):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val=(double)ad_val*62.5/1000000.0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; case(0x03):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val=(double)ad_val*31.25/1000000.0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; case(0x04):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val=(double)ad_val*15.625/1000000.0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; case(0x05):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val=(double)ad_val*7.8125/1000000.0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; return val;</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">}</span></span></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 6.下载程序分别测试0V和3.3V</span></span></p>

<p></p>

<p><span style="font-family:楷体;"><span style="font-size:18px;">&nbsp; &nbsp; 总结:1.HPM6750的I2C最高速率目前是1000K,2.HPM6750的库中I2C是给7bit地址,读写函数自动移位和增加读写位,所以只需要定义I2C从机实际地址就可以。</span></span></p>

lugl4313820 发表于 2022-8-15 16:30

象这种采样不是要求速率快吧,1000K,估计要比转换速度快很多了,够用了吧。

xiashuang 发表于 2022-8-16 10:59

lugl4313820 发表于 2022-8-15 16:30
象这种采样不是要求速率快吧,1000K,估计要比转换速度快很多了,够用了吧。

<p>我一般喜欢在I2C上会带很多芯片,速度快了处理起来比较方便</p>
页: [1]
查看完整版本: 【先楫HPM6750测评】测试I2C与ADS1115通信