This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:使用 I2C 协议读取 TCAN75S 温度值的代码

Guru**** 2380860 points
Other Parts Discussed in Thread: MSP430G2553
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1390911/msp430g2553-code-to-read-temperature-values-of-tcn75s-using-i2c-protocol

器件型号:MSP430G2553

工具与软件:

您好!

我正在使用 MSP 微控制器 读取的温度值 "TCN75S" 使用 "I2C" 协议。 我的代码似乎存在问题、因为即使在执行代码的情况下也不会读取温度值。

要验证我是否使用了"printf"命令、但收到错误消息:  "../lnk_msp430g2553.cmd"、第93行:错误#10099-D:程序无法装入可用存储器、或该段包含一个调用站点、该调用站点需要无法为此段生成 trampoline。 针对段".sysmem"大小0x50运行带对齐的放置失败。  可用存储器范围:

RAM 大小:0x200未使用:0xe0最大空洞:0xe0
"../lnk_msp430g2553.cmd"、第94行:错误#10099-D:程序无法装入可用内存、或该段包含一个调用站点、该调用站点需要无法为此段生成 trampoline。 针对段".stack"大小0x50运行带对齐的放置失败。 可用存储器范围:
RAM 大小:0x200未使用:0x36最大空洞:0x36

这是我的代码:

#include
#include
#include
// TCN75S I2C 地址(7位地址左移1位)
#define TCN75S_ADDRESS 0x48

void initI2C(){
//配置 I2C 引脚(P1.6为 SDA、P1.7为 SCL)
P1DIR &=~(BIT6 | BIT7);
P1SEL |=位6 |位7;
P1SEL2 |=位6 |位7;

//初始化 I2C 模块(UCB0)
UCB0CTL1 |= UCSWRST;//启用软件复位
UCB0CTL0 = UCMST | UCMODE_3 | UCSYNC;// I2C 主器件、同步模式
UCB0BR0 = 10;//设置时钟分频器(根据需要进行调整)
UCB0BR1=0;
UCB0I2CSA = TCN75S_ADDRESS;//设置从器件地址
UCB0CTL1 &=~μ s UCSWRST;//释放软件复位
}

void writeByte (uint8_t data){
UCB0TXBUF =数据;
while (UCB0STAT & UCBBUSY);//等待发送完成
}

uint8_t readByte (){
UCB0CTL1 &=~μ s UCTR;//更改为读取模式
UCB0CTL1 |= UCTXSTT;//生成重复的启动条件
while (UCB0CTL1 & UCTXSTT);//等待启动条件

while (UCB0STAT & UCBBUSY);//等待接收完成
UCB0CTL1 |= UCTXSTP;//生成停止条件
返回 UCB0RXBUF;
//读取接收到的数据
}

// float readTemperature(){
// writeByte (0x00);//发送温度寄存器地址(0x00)
//返回(float) readByte ()* 0.5;//转换为摄氏度


int main (void){
浮点温度;

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
initI2C ();//初始化 I2C 通信

while (1){
writeByte (0x00);//发送温度寄存器地址(0x00)
TempCelsius =(float) readByte ()* 0.5;//转换为摄氏度

//根据需要使用温度(例如、在 LCD 上显示、通过 UART 发送等)
printf ("温度值为:%f"、温度系数);
//在此添加延迟或其他逻辑
}
}

我还收到以下片段中的问题、我无法生成启动条件:

uint8_t readByte (){
UCB0CTL1 &=~μ s UCTR;//更改为读取模式
UCB0CTL1 |= UCTXSTT;//生成重复的启动条件
while (UCB0CTL1 & UCTXSTT);//等待启动条件

while (UCB0STAT & UCBBUSY);//等待接收完成
UCB0CTL1 |= UCTXSTP;//生成停止条件
返回 UCB0RXBUF;
//读取接收到的数据
}  


为该应用申请示例参考代码。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您似乎根本不了解如何使用 I2C。 UCBBUSY 上的这些等待是一个问题:

    总线忙位、UCBBUSY、在起始后被置位、在停止后被清零。

    G2xx3的代码示例包包含13个不同的 I2C 示例。 虽然其中不包含有关访问特定目标的信息、但却展示了如何使用 I2C。