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.

[参考译文] CCS/MSP432P401R:需要简单代码才能通过 I2C 读取 TMP007模板

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/696192/ccs-msp432p401r-need-simple-code-to-read-tmp007-temps-through-i2c

器件型号:MSP432P401R

工具/软件:Code Composer Studio

您好!

是否有人可以使用 MSP430或 MSP432通过单个简单代码文件运行获取 TMP007的温度? 我不想使用 SimpleLink MSP432P4 TI 驱动程序示例、该项目引用的外部文件太多。 只需一个文件即可 轻松实现到我自己的设计中。 下面的代码与我要查找的代码类似、只是为不同的传感器编写的代码。

#include "msp.h"
#include 
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "lcd.h"

#define TCN_address 0x48

void InitTCN (uint8_t DeviceAddress);
void ConfigTCN (uint8_t MemAddress、uint8_t MemByte);
void itoa (long uint8_t 结果

、unsigned tchar);void int8_t int_t readchar (reverse int8 (uint_t int_t)

void 分解(int num);

uint16_t TransmitFlag = 0;

uint16_t ReceiveByte;
uint16_t test;
int six;
int five;
int 4;
int 3;
int 2;
int 1;
int main (void)
{
uint32_t i;
浮动摄氏温度;
浮式法伦特;
浮动快递;
float Faren;
char outputc[6];
char outputF[6];
char temp[]="温度:";


WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //停止看门狗计时器

__ENABLE_IRQ(); //启用全局中断

P2->SEL1 &=~Ω(BIT5 | BIT6 | BIT7 | BIT3);//将端口2分别设置为 GPIO (红色 LED、绿色 LED、蓝色 LED 和开关)
P2->SEL0 &=~Ω(BIT5 | BIT6 | BIT7 | BIT3);
P2->DIR |= BIT5 | BIT6 | BIT7; //设置为输出引脚
P2->DIR &=~BIT3; //设置为输入引脚
P2->REN |= BIT3; //启用上拉电阻器
P2->OUT |= BIT3; //设置为读取

lcd_init(); //初始化 LCD

InitTCN (TCN_address); //设置 PMOD 器件的总线地址


ConfigTCN (0x01、0xE3); //为一次性模式、12位数据和断电设置 PMOD
对于(i = 500;i > 0;i-); // TCN 写入周期延迟

while (1){
ReadTCN (0x00); //从 TCN 读取值
Celsius =(ReceiveByte)* 0.0625; //根据 TCN75A 数据表中的公式将二进制输出转换为十进制、单位为摄氏度
CEL = 10000 *摄氏度; //转换摄氏以保留十进制值之后的数字
华氏度=(摄氏* 1.8)+ 32; //将摄氏温度转换为华氏温度
Faren = 10000 * Farenheit; //移动 Farenheit 以保留十进制值之后的数字

分解(Faren); //保留法拉特值
CLEAR_LCD(); //清除 LCD 屏幕
对于(I = 50000;I > 0;I-);// TCN 写入周期延迟(5ms)

itoa (快递、输出、10); //法伦特的整数到数组
itoa(法伦,输出 F,10); //整数到数组,以摄氏度为单位

LCD_WRITE (temp); //将"Temperature:"写入 LCD

if (华氏>= 85){ //检查从 TCN 读取的温度
P2->OUT |= BIT5; //将红色 LED 设置为打开
P2->OUT &=~(BIT6 | BIT7); //关闭其他 LED
}
if (华氏度< 85 &&华氏度> 50){ //检查从 TCN 读取的温度
P2->OUT |= BIT6; //打开绿色 LED
P2->OUT &=~(BIT5 | BIT7); //关闭其他 LED
}

if (华氏<= 50){ //检查从 TCN 读取的温度
P2->OUT |= BIT7; //打开蓝色 LED
P2->OUT &=~(BIT5 | BIT6); //关闭其他 LED
}

if (P2IN & BIT3){ //检查开关位置是否过低

LCD_COMMAND (0x80); //将光标设置为开头
对于(I = 50000;I > 0;I-); // TCN 写入周期延迟
LCD_COMMAND (0xC0); //在第二行写入
对于(I = 50000;I > 0;I-); // TCN 写入周期延迟
LCD_DATA (outputc[0]); //写入摄氏值
LCD_DATA (outputc[1]);
LCD_DATA ('.');
LCD_DATA (outputc[2]);
LCD_DATA (outputc[3]);
LCD_DATA (outputc[4]);
LCD_DATA (outputc[5]);
LCD_DATA (0xDF);
LCD_DATA ('C');
}

否则{
LCD_COMMAND (0x80); //将光标设置为开头
对于(I = 50000;I > 0;I-); // TCN 写入周期延迟(5ms)
LCD_COMMAND (0xC0); //写入 LCD 的第二行
对于(I = 50000;I > 0;I-); // TCN 写入周期延迟(5ms)
LCD_DATA (outputF[0]); //写入 Farenheit 的值
LCD_DATA (outputF[1]);
LCD_DATA ('.');
LCD_DATA (outputF[2]);
LCD_DATA (outputF[3]);
LCD_DATA (outputF[4]);
LCD_DATA (outputF[5]);
LCD_DATA (0xDF);
LCD_DATA ('F');
}
//__sleep(); //进入低功耗模式
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//
//初始化 I2C 总线以与 TCN75A 通信。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void InitTCN (uint8_t DeviceAddress)
{

P1->SEL0 |= BIT6 | BIT7; //设置 eUSCI_B0的 I2C 引脚

//在 NVIC 模块
NVIC->ISER[0]中启用 eUSCIIB0中断<<(((EUSCIIB0_IRQn)& 31);

//为 I2C 模式配置 USCI_B0
EUSCI_B0->CTLW0 |= EUSCI_A_CTLW0
|在 EUSCI_SW0中启用/重置 EUSCI_SW0 | USWLWRST_RESET= EUSCI_0
EUSCI_B_CTLW0_MODE_3 | // I2C 模式
EUSCI_B_CTLW0_MST | //主模式
EUSCI_B_CTLW0_SYNC | //同步模式
EUSCI_B_CTLW0_UCSSEL_3; // SMCLK

EUSCI_B0->BRW = 30; //波特率= SMCLK / 30 = 100kHz
EUSCI_B0->I2CSA = DeviceAddress; //从器件地址
EUSCI_B0->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//从复位

EUSCI_B0->IE 释放 eUSCI |= EUSCI_A_IE_RXIE | //启用接收中断
EUSCI_A_IE_TXIE;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
////函数、通过写入配置寄存器来配置 PMOD。
//指针寄存器0x01是配置的寄存器。
//
//地址- 1字节地址指定 PMOD 存储器中的地址
// MemByte -存储在 PMOD //

//过程中的1字节值
:// 启动
// 发送地址+W (CONTROL+0) -> ACK (来自 PMOD)
// 发送数据 (地址) -> ACK (来自 PMOD)
// 发送数据 (数据) -> ACK (来自 PMOD)
// 停止
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void ConfigTCN (uint8_t MemAddress、uint8_t MemByte)
{

EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TR; //设置发送模式(写入)
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT; // I2C 启动条件

while (!TransmitFlag); //等待发送完成
TransmitFlag = 0;

EUSCI_B0 -> TXBUF = MemAddress;//发送存储器地址的字节

while (!TransmitFlag); //等待发送完成
TransmitFlag = 0;

EUSCI_B0 -> TXBUF = MemByte; //发送字节以存储在 EEPROM

中 while (!TransmitFlag); //等待发送完成
TransmitFlag = 0;

EUSCI_B0 -> CTLW0 |= EUSCI_B_CTLW0_TXSTP;// I2C 停止条件
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//
//从 PMOD 读取单个字节的函数。
//
//地址-1字节地址指定 PMOD 存储器中的地址
// ReceiveByte -1字节值,该字节值从 PMOD 接收
//
////过程:
// 启动
// 发送地址+W (CONTROL+0)-> ACK (来自 PMOD)
// 发送数据 (地址) -> ACK (来自 PMOD)
// 启动
// 发送地址+R (CONTROL+1)-> ACK (来自 PMOD)
// 发送数据 (数据) -> NACK (来自 MSP432)
// 停止
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

uint16_t ReadTCN (uint8_t MemAddress)
{

uint16_t ReceiveHiByte;
uint16_t ReceiveLoByte;

EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TR; //设置发送模式(写入)
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;// I2C 启动条件


while (!TransmitFlag); //等待发送完成
TransmitFlag = 0;

EUSCI_B0 -> TXBUF = MemAddress;//发送存储器地址的字节

while (!TransmitFlag); //等待发送完成
传输 TransmitFlag = 0;

EUSCI_B0->CTLW0 &&~EUSCI_B_CTLW0_TR;//设置接收模式(读取)
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;//等待发送


时(TXSCI_B0);EUSCI_CTLW0_TXT (等待发送时)

//等待接收一个字节
TransmitFlag = 0;

EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP;

ReceiveHiByte = EUSCI_B0->RXBUF;//在

(!TransmitFlag)期间从缓冲区读取字节; //等待接收一个字节
TransmitFlag = 0;

//将停止位设置为在第二个数据字节
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP 之后触发;

ReceiveLoByte = EUSCI_B0->RXBUF;//从缓冲区读取字节

ReceiveByte =((ReceiveHiByte << 8)| ReceiveLoByte)>> 4;


return (ReceiveByte);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
////
I2C 中断服务例程
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void EUSCIB0_IRQHandler (void)
{
IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG0) //检查传输是否完成
{
EUSCI_B0->IFG &=~ EUSCI_B_IFG_TXIFG0;//清除中断标志
TransmitFlag = 1; //设置全局标志
}

IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG0) //检查接收是否完成
{
EUSCI_B0->IFG &=~ EUSCI_B_IFG_RXIFG0;//清除中断标志
TransmitFlag = 1; //设置全局标志
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//
////将数字转换为数组值的函
数////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void itoa (long unsigned int 值、char*结果、int base)
{
//检查底座是否有效
if (base < 2 || base > 36){* result ='\0';}

char* ptr =结果、*ptr1 =结果、tmp_char;
int tmp_value;

执行{
tmp_value =值;
值/=基值;
* PTR++="zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 +(tmp_value - value * base)];
} while (value);

//应用负号
如果(tmp_value < 0)*ptR++='-';
*PTR-='\0';
while (ptr1 < ptr){
tmp_char =* ptr;
*ptr--=*ptr1;
*ptr1++= tmp_char;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//
//函数在数据转换后分解和保留数据
//并乘以10000。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void decPosition (int num){
1 = num % 10;
两=(num/10)%10;
三=(num/100)%10;
四=(num/1000)%10;
五=(num/10000)%10;
六=(num/100000)%10;
}

谢谢!

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

    Nadir、

     使用"外部文件太多"时遇到什么问题? 编译器或 IDE 是否存在问题? (什么是 CCS?)  我的建议是至少使用基于 driverlib 的代码、而不是您现在使用的寄存器级代码-它更易于读取和移植。 遗憾 的是、我们没有直接针对 TMP007的 driverlib 示例、但是从 TI 驱动程序示例中 i2ctmp007.c 的第98-104行、您可以看到正在向传感器发送哪些值以及如何读回。 然后、您可以将该信息折叠到 TI driverlib 示例 i2c_master_rw_erial_start-master_code中。

    希望这会有所帮助。

    此致、

     -Bob L.