完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
ADS1115与MSP430的使用 驱动程序如下 #include#include "ads1115.h"void delay(){ uint i; for(i=0;i<20000;i++);}void wait(){ uchar i=3; while(i--); _NOP();}void start(){ S_SDA; //数据线拉高 wait(); S_SCL; //时钟为高 wait(); C_SDA; //数据线拉低,表起始信号 wait(); C_SCL; //时钟为低,允许数据改变 wait();}void stop(){ C_SCL; wait(); C_SDA; wait(); S_SCL; wait(); S_SDA; //在SCL为高器期间,数据线上升,表停止}void ack() //应答{ C_SDA; wait(); S_SCL; wait(); C_SCL; wait(); S_SDA;}uchar check_ack(){ uchar ack; S_SDA; wait(); S_SCL; wait(); ack=SDA & 0x80; C_SCL; _NOP(); if(ack) return 1; //无应答 else return 0; //有应答}void write_byte(uchar byte){ uchar i; C_SCL; for(i=0;i<8;i++) { if(byte & 0x80) S_SDA; else C_SDA; //送数据 wait(); S_SCL; //拉高控制线 wait(); C_SCL; //拉低时钟线,允许数据改变 byte <<= 1; //准备下一位 }}uchar read_byte(void){ uchar byte=0,i; P1DIR &= ~BIT7; wait(); for(i=0;i<8;i++) { S_SCL; wait(); byte <<= 1; if(SDA & 0X80) byte |= 0x01; C_SCL; wait(); } return byte;}void write_word(uchar addr,uint word){ uchar byte=0x90; //0b10010000 start(); write_byte(byte); //写地址 byte = check_ack(); write_byte(addr); //指定寄存器 byte = check_ack(); write_byte(word>>8); //写高字节 byte = check_ack(); write_byte(word); //写低字节 byte = check_ack(); stop();}uint read_word(uchar addr){ uint word; uchar byte=0x90; //0b10010000 start(); write_byte(byte); //写地址 byte = check_ack(); write_byte(addr); //指定寄存器 byte = check_ack(); stop(); wait(); start(); byte=0x91; //0b10010001 write_byte(byte); //写地址,操作为读 byte = check_ack(); word = read_byte(); //读高字节 ack(); word <<= 8; byte = read_byte(); //读低字节 ack(); word += byte; stop(); return word;}void main(void){ uint value; uint tmp; float u; WDTCTL=WDTPW+WDTHOLD; P1DIR |= BIT1; P1OUT &= ~BIT7; stop(); while(1) { write_word(0x01,0xc383); //0b1100 0011 1000 0011 delay(); value = read_word(0x00); //读取值 tmp = value & 0x7fff; u = 4.096 * tmp / 32768; if(value>0x7fff) u = 0.0; u *= 1000; }} |
|
相关推荐
2个回答
|
|
|
点赞;ADS1115的时序要求比较严格,针对不同的MCU移植时需要注意时间
|
|
|
|
|
|
看起来您正在讨论如何使用ADS1115与MSP430微控制器。ADS1115是一个16位的模数转换器(ADC),它可以通过I2C接口与MSP430微控制器进行通信。以下是一些关键步骤和代码示例,以帮助您实现这一功能。
1. 硬件连接: - 将ADS1115的VDD引脚连接到MSP430的3.3V电源。 - 将ADS1115的GND引脚连接到MSP430的地线。 - 将ADS1115的SCL引脚连接到MSP430的SCL引脚(P1.6)。 - 将ADS1115的SDA引脚连接到MSP430的SDA引脚(P1.7)。 2. 初始化I2C接口: - 在MSP430中,您需要配置I2C接口以与ADS1115通信。这通常涉及到设置时钟速率和启用I2C模块。 3. 编写驱动程序: - 您已经提供了部分驱动程序代码。以下是一些关键函数的解释: - `delay()`:这个函数用于创建一个简单的延迟。 - `wait()`:这个函数用于等待I2C时钟稳定。 - `start()`:这个函数用于生成I2C起始条件。 4. 读取ADC值: - 要读取ADS1115的ADC值,您需要发送一个I2C地址和寄存器地址,然后读取返回的数据。 以下是一个简单的代码示例,用于读取ADS1115的ADC值: ```c #include #include "ads1115.h" void init_ads1115() { // 初始化I2C接口 UCB0CTL1 |= UCSWRST; // 重置I2C模块 UCB0CTL0 = UCCKPH | UCMST | UCSYNC; // 主模式,同步模式 UCB0CTL1 = UCSSEL_2; // 使用SMCLK作为时钟源 UCB0BR0 = 0x02; // 设置时钟速率 UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; // 启用I2C模块 } uint16_t read_ads1115(uint8_t reg) { uint16_t value = 0; // 发送起始条件 I2C_START(); // 发送设备地址和寄存器地址 I2C_TX(ADS1115_ADDR << 1); I2C_WAIT(); I2C_TX(reg); I2C_WAIT(); // 发送重复起始条件 I2C_START(); // 读取数据 I2C_TX((ADS1115_ADDR << 1) | 1); I2C_WAIT(); value = I2C_RX(); I2C_WAIT(); value |= (I2C_RX() << 8); I2C_WAIT(); // 发送停止条件 I2C_STOP(); return value; } int main() { WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗定时器 // 初始化ADS1115 init_ads1115(); while(1) { uint16_t adc_value = read_ads1115(ADS1115_REG_CONVERT); // 处理ADC值 } } ``` 请注意,这个示例代码仅用于演示如何与ADS1115通信。您需要根据您的具体需求进行修改和扩展。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
549 浏览 0 评论
1613 浏览 0 评论
2047 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1513 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1337 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1756浏览 29评论
2781浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1723浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1634浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1645浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 20:59 , Processed in 0.616776 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
6673