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.
器件型号: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.