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 / CC430F5137:与 MS8803-01BA 的 I2C 通信

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/799669/ccs-cc430f5137-i2c-communication-with-ms5803-01ba

器件型号:CC430F5137

工具/软件:Code Composer Studio

大家好、我正在使用  cc430f5137 假体与 MS5803-01BA 压力传感器进行 I2C 通信。

我用一些示例构建了一个代码、我有 erro #10234-D  

我认为我的代码出了点问题、但我找不到问题所在。

这是代码。

如果有人知道问题、请为我回复:)

#include "MS5803.h"
#include
#include
#include
#include "General.h"

//全局变量
uint16_t sensorCoeff[8];// MS5803校准系数的数组
uint8_t HighByte = 0;// MS5803数据读取占位符
uint8_t MidByte = 0;// MS5803数据读取占位符
uint8_t LowByte = 0;// MS5803数据读取占位符

//主文件中定义的失效防护标志
//extern uint8_t no_timeout;
//extern uint8_t 传感器;
uint8_t SHT_WAIT = 0;
uint8_t MS5803_WAIT = 0;
uint8_t failsafe = 0;

///---------------------------------------------------------
// MS5803_coeff ()
//
//函数读取出厂校准系数并进行存储
//放入 sensorCoeff[]数组
///---------------------------------------------------------
void MS5803_coeff (void){
unsigned int c;
//重置传感器
//启用具有半秒超时的看门狗计时器
WDTCTL = WDTPW | WDTCNTCL | WDTIS1 | WDTIS0;
I2Ctx (MS5803_ADDRESS、MS5803_RESET);
//禁用看门狗计时器
WDTCTL = WDTPW | WDTHOLD;
延迟(1000);

对于(c = 0;c < 8;c++){
//发送读取系数命令
I2Ctx (MS5803_ADDRESS、(MS5803_PROM 读取_BASE +(c * 2)));

//接收两个字节
//启用具有半秒超时的看门狗计时器
WDTCTL = WDTPW | WDTCNTCL | WDTIS1 | WDTIS0;
//清除接收模式的 UCTR
UCB0CTL1 &=~0x10;
//将 UCTXSTT 置位以发送从器件地址和读取位
UCB0CTL1 |= 0x02;
//读取第一个字节
//等待 RXBUF 被填满
while (((UCB0IFG & 0x01)=0x00);
//复位活动的看门狗计时器
WDTCTL = WDTPW | WDTCNTCL | WDTIS1 | WDTIS0;
//从 RXBUF 读取值
高字节= UCB0RXBUF;
//读取第二个字节
//设置 STP 标志以发送 NACK 和 STOP
UCB0CTL1 |= 0x04;
//等待 RXBUF 被填满
while (((UCB0IFG & 0x01)=0x00);
//从 RXBUF 读取值
低字节= UCB0RXBUF;
//禁用看门狗计时器
WDTCTL = WDTPW | WDTHOLD;

sensorCoeff[c]=(无符号整型)高字节<<8)+低字节;

uint8_t p_crc = sensorCoeff[7]和0x000F;
uint8_t n_CRC = MS5803_CRC (sensorCoeff);

if (p_crc!= n_crc){
WDTCTL = 10;//复位微控制器

///---------------------------------------------------------
// MS5803_CRC()
//
//对 MS5803系数执行 CRC 校验的函数
//如果发现错误,程序将因故障而停止
//将进行通信和计算
///---------------------------------------------------------
uint8_t MS5803_CRC (uint16_t n_prom[]){
unsigned int cnt;
unsigned int n_rem;
unsigned int crc_read;
unsigned char n_bit;
n_rem = 0x00;
CRC_READ = n_PROM[7];
sensorCoeff [7]=(0xFF00 &(n_prom[7]));
对于(cnt = 0;cnt < 16;cnt++){
if (cnt%2 = 1){
n_rem ^=(无符号短整型)((n_prom[cnt>>1])& 0x00FF);

否则{
n_rem ^=(无符号短整型)(n_prom[cnt>1]>8);

对于(n_bit = 8;n_bit > 0;n_bit--){
if (n_rem &(0x8000)){
n_rem =(n_rem <1)^ 0x3000;

否则{
n_rem =(n_rem <1);



n_rem =(0x000F &(n_rem >>12));
n_prom[7]= CRC_READ;
返回(n_rem ^ 0x00);


///---------------------------------------------------------
// MS5803_READ_DATA ()
//
//函数从 MS5803传感器读取3个字节的数据
//数据作为参数返回以用于计算
///---------------------------------------------------------
unsigned long MS5803_read_data (void){
长整型结果= 0;

//发送命令来读取 MS5803 ADC
I2Ctx (MS5803_ADDRESS、MS5803_ADC_READ);
延迟(10);
if (no_timeout){
//接收3个字节
//启用超时计时器中断-0.5秒
TA0CCR2 = TA0R + 16384;
TA0CCTL2 = CCIE;
_bis_SR_register (GIE);
//清除接收模式的 UCTR
UCB0CTL1 &=~0x10;
//将 UCTXSTT 置位以发送从器件地址和读取位
UCB0CTL1 |= 0x02;
//读取第一个字节
//等待 RXBUF 被填满
while ((((UCB0IFG & 0x01)=0x00)&& NO_TIMEOUT);
if (no_timeout){
//从 RXBUF 读取值
高字节= UCB0RXBUF;
//读取第二个字节
//等待 RXBUF 被填满
while ((((UCB0IFG & 0x01)=0x00)&& NO_TIMEOUT);
if (no_timeout){
//从 RXBUF 读取值
中间字节= UCB0RXBUF;
//设置 STP 标志以发送 NACK 和 STOP
UCB0CTL1 |= 0x04;
//等待 RXBUF 被填满
while ((((UCB0IFG & 0x01)=0x00)&& NO_TIMEOUT);
if (no_timeout){
//从 RXBUF 读取第三个字节
低字节= UCB0RXBUF;




//禁用超时计时器
TA0CCTL2 = 0;
_BIC_SR_register (GIE);
//解析传感器数据
结果=((长)高字节<< 16)+((长)中字节<< 8)+(长)低字节;
返回结果;


///---------------------------------------------------------
// MS5803_calc ()
//使用计算温度和压力的函数
//校准系数和测量数据。
//首先计算温度值并将其用作参数
//校准压力计算
///---------------------------------------------------------
void MS5803_calc (uint32_t d1、uint32_t d2、float Array[]){

//局部变量
int32_t dT = 0;
int32_t TEMP = 0;
int64_t 偏移= 0;
int64_t 灵敏度= 0;
int64_t t2 = 0;
int64_t OFF2 = 0;
int64_t Sens2 = 0;
int32_t mbarInt = 0;

//计算一阶温度,dT 为一个长有符号整数
dt =(int32_t) d2 -((int32_t) sensorCoeff[5]* 256);//(int32_t)(((uint32_t) d2 -((uint32_t) sensorCoeff[5]* 256UL);
//使用整数除法来计算 TEMP
temp = 2000 +((int64_t) dT * sensorCoeff [6])/ 8388608LL;// 2000 +(int64_t)(((int64_t) dT *(uint64_t) sensorCoeff [6])/ 8388608LL);
temp =(int32_t) TEMP;

//二阶温度补偿
if (TEMP < 2000){
t2 =((int64_t) dT * dT)/2147483648ULL;//((int64_t) dT *(int64_t) dT)/2147483648ULL;
t2 =(int32_t) t2;
OFF2 = 3*((TEMP - 2000)*(TEMP - 2000));
Sens2 = 7 *((TEMP - 2000)*(TEMP - 2000))/ 8;

否则{
T2 = 0;
OFF2 = 0;
Sens2 = 0;
if (TEMP > 4500){
Sens2 = Sens2 -((TEMP - 4500)*(TEMP - 4500))/ 8;

//在极低温度下进行额外补偿
if (TEMP <-2500){
Sens2 = Sens2 + 2 *((TEMP + 1500)*(TEMP + 1500));

//计算初始偏移和灵敏度
偏移=(int64_t) sensorCoeff [2]* 65536 +(sensorCoeff [4]*(int64_t) dT)/128;//(int64_t)(((uint64_t) sensorCoeff [2]* 65536ULL +(((uint64_t) sensorCoeff *)))/t (int64_t)) t)
灵敏度=(int64_t) sensorCoeff [1]* 32768 +(sensorCoeff [3]*(int64_t) dT)/256;//灵敏度=(int64_t)(((uint64_t) sensorCoeff [1]* 32768ULL +(((uint64_t) sensorCoeff))*/t (int64_t))))/int64_t)/t

//根据上面的二阶校正调整 TEMP、Offset、Sensitivity 值
温度=温度- T2;
偏移=偏移- OFF2;
灵敏度=灵敏度- Sens2;

//最终计算
MbarInt =((D1 *灵敏度)/ 2097152 -偏移量)/ 32768;//mbarInt =(int32_t)(((((uint64_t) D1 *灵敏度)/ 2097152LL -偏移量)/ 32768LL);
array[0]=(float) MbarInt / 100;//mbar
array[1]=(float) TEMP / 100;//tempC
array[2]=(array[1]* 1.8)+ 32;//tempF

void Pin_init (void){
//写入访问代码以访问端口映射寄存器
PMAPKEYID = 0x02D52;

//将端口映射到辅助功能
P1MAP3 = PM_UCB0SDA;//将 P1.3设置为 SDA
P1MAP2 = PM_UCB.S;//将 P1.2设置为 SCL
P1SEL |= 0x6C;//启用 P1.2、P1.3、P1.5、P1.6
//将所有其它引脚设置为输出模式、低电平以最大限度地降低功耗
P1DIR |= 0x93;//除 P1.2、3、5、6之外的所有


void Timer_init(){
//确保禁用计时器
TA1CTL &=~(MC0 | MC1);

//TA1CTL |= TASSEL1;//将时钟源设置为 SMCLK (1.048576MHz)
//TA1CTL |= ID1 | ID2;//将预分频器设置为/8
TA1CTL |= TASSEL1 | ID1 | ID0;
TA1EX0 |= TAIDEX1 | TAIDEX0;//将预分频器设置为4
//清除计数器以重置逻辑
TA1CTL |= TACLR;
//启用向上计数模式中的计数
TA1CTL |= MC1;

针对32kHz 的//计时器 A0设置(与上面一样)
//TA0CTL &=~(MC0 | MC1);
TA0CTL |= TASSEL1 | ID1 | ID0 | MC1;
TA0EX0 |= TAIDEX1 | TAIDEX0;
TA0CTL |= TACLR;

//启用 CCR1上的中断
TA0CCR1 = 65535;
TA0CCTL1 = CCIE;

void I2C_init (void){
//将 UCSWRST 位置位来复位 USCI 模块
UCB0CTL1 |= 0x01;

//配置控制寄存器
//CC430系列用户指南中的表24-3和24-4
//UCB0CTL0 &=~0x80;//自身地址设置为7位
//UCB0CTL0 &=~0x40;//从地址长度设置为7位
//UCB0CTL0 &=~0x20;//单主器件环境
//UCB0CTL0 |= 0x08;//选择主控模式
//UCB0CTL0 |= 0x06;选择//I2C 模式(11)
//UCB0CTL0 |= 0x01;//选择同步模式
UCB0CTL0 |= 0x0F;//这两行全部完成
UCB0CTL0 &=~0xE0;//两条指令中的设置


//定义时钟预分频器
// UCBR0 =(UCB0BR0 + 256 * UCB0BR1)
// f (bit_clock)= f (BR_clock)/UCBR0
UCB0CTL1 |= 0xC0;//为 BRCLK 源选择 SMCLK (1.048576MHz)
UCB0BR1 = 0;//将 UCBR0设置为10以实现
UCB0BR0 = 10;//位频率为100kHz

//定义主地址
UCB0I2COA &&~0x83FF;//禁用常规调用响应
UCB0I2COA |= 0x003A;//将 I2C 地址设置为0x3A


//清除 UCSWRST 以为模块加电
UCB0CTL1 &=~0x01;

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

    10234-D 的错误描述是什么? 错误的位置在哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

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

    它显示"未解析符号保留"、这意味着您应该在使用符号之前声明或定义符号。 请查找您在代码中使用的符号未声明或定义。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我选中了它、它仍然是相同的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否要向我分享您的项目以进行检查?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    5天以来,我没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我查了一下,它仍然是一樣的。μ A
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您可以与我分享您的项目、以便我可以在我的一侧编译该项目以检查您的问题。 如果现在一切顺利、请继续、当您遇到进一步的问题时、请随时返回。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MS5803.h

    #ifndef MS5803_H_
    #define MS5803_H_

    #include
    #include
    #include

    //MS5803常量定义
    #define MS5803_address 0x77
    #define MS5803_RESET 0x1E
    #define MS5803_CONVERT_PRESSURE 0x48 //延迟10ms 必需
    #define MS5803_convert _温度0x58 //延迟需要10ms
    #define MS5803_ADC_READ 0x00
    #define MS5803_PROM READ_BASE 0xA0

    //函数声明
    void MS5803_coeff (void);
    uint8_t MS5803_CRC (uint16_t n_prom[]);
    unsigned long MS5803_read_data (void);
    void MS5803_calc (uint32_t d1、uint32_t d2、浮点阵列[]);

    #endif /* MS5803_H_*

    General.h

    #ifndef General_H_
    #define General_H_

    #include
    #include
    #include
    //#include "RF1A.h"
    //#include "RfRegSettings.c"

    #define SmartRF Studio 中的 PATABLE_VAL 0xC3 //0xC3对应10dBm
    SmartRF Studio 的+/0x8D、功率为0dBm
    ///0x2D 来自 SmartRF Studio、功率为-6dBm
    //0x25来自 SmartRF Studio、功率为-12dBm
    来自 CC430无线电示例的//0x51
    void I2Ctx (uint8_t SlaveAddress、char TxData);
    //事件操作码定义
    //#define SHT_RELH_EVENT 0x01
    //#define SHT_TEMP_EVENT 0x02
    #define MS5803_D1_EVENT 0x03
    #define MS5803_D2_EVENT 0x04
    //#define MATH_EVENT 0x05
    //#define FEC_EVENT 0x06
    //#define BATT_EVENT 0x07
    //#define IMU_EVENT 0x08
    //#define RADIO_EVENT 0x09
    //#define IMU_MATH_EVENT 0x0A

    //时隙定义
    //#define GPS_TIME 3604//110ms 用于 GPS
    //#define RADIO_TIME 1540 //47ms 对于无线电 TX -> 16个时隙/通道/秒
    //#define NUM_SLOTS 16 //每秒的时隙数
    //#define SHT_RELH_TIME 852/26 ms 用于测量 SHT_RelH
    //#define SHT_TEMP_TIME 2327 //71ms 用于测量 SHT_TEMP_TIME
    #define MS5803_D1_TIME 459 //14ms 用于 MS5803 D1测量
    #define MS5803_D2_TIME 459 //14ms 用于 MS5803 D2测量
    //#define MATH_TIME 2884 //88ms 用于数学和数据包控制
    //#define FEC_TIME 1966 //60ms 用于 FEC 编码
    //#define BATT_TIME 99 //3ms 用于模拟读取
    //#define IMU_TIME 165//5ms、用于读取 LSM9DS1
    //#define IMU_SLOT_1 5242 //在159.97ms 进行首次 IMU 测量
    //#define IMU_SLOT_2 (IMU_SLOT_1 + 8192)// 250ms 后的第二次 IMU 测量
    //#define IMU_SLOT_3 (IMU_SLOT_2 + 8192)// 250ms 后的第三次 IMU 测量
    //#define IMU_SLOT_4 (IMU_SLOT_3 + 8192)// 250ms 后的第四次 IMU 测量
    //#define IMU_MATH_TIME 1310 //IMU 风能数学-> 40米

    uint8_t NO_TIMEOUT = 1;
    uint8_t 传感器= 0;

    void I2Ctx (uint8_t SlaveAddress、char TxData){

    Sensor = SlaveAddress;//通过 slaveaddress 识别传感器

    //启用超时计时器中断-0.5秒
    NO_TIMEOUT = 1;
    TA0CCR2 = TA0R + 16384;
    TA0CCTL2 = CCIE;
    _bis_SR_register (GIE);

    //将7位从器件地址写入 UCB0I2CSA
    UCB0I2CSA =从地址;

    //将 UCTR 设置为发送模式
    UCB0CTL1 |= 0x10;

    //设置 UCTXSTT 以发送开始信号和从器件地址
    UCB0CTL1 |= 0x02;

    //写入字节以发送到 UCB0TXBUF
    UCB0TXBUF = TxData;

    //等待,直到发送“开始”信号
    while ((((UCB0CTL1 & 0x02)=0x02)&& NO_TIMEOUT);

    //如果未发生超时..
    if (no_timeout){
    //发送停止信号
    UCB0CTL1 |= 0x04;

    //禁用超时计时器
    TA0CCTL2 = 0;
    _BIC_SR_register (GIE);


    //void UART_init (void);

    //void UART_TX (uint8_t packet[]、int 大小);
    //uint8_t MeasureBatt (void);
    void Channel_Assign (unsigned long time[]、uint8_t event[]、unsigned int id);
    void MakePacket (float MS5803_calcVals[]、float SHT25_relH、float SHT25_tempF、unsigned char buffer[]、unsigned char Packet[]、 unsigned long id、unsigned char batt、int16_t accelData[]、int16_t gyroData[]);
    void StreamPacket (float MS5803_calcVals[]、unsigned char buffer[]、unsigned char Package[]、unsigned long id、int16_t accelData[]、 int16_t gyroData[]、int16_t magData[]);
    void delay (volatile unsigned long I);
    #endif

    這是我的程式碼 μ A

    我不知道錯誤在哪裡 μ A

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

    您好!

    我想您在上次答复中分享了您的头文件、对吧? 我在 CCS v9.0.0中复制了测试项目中的代码、它显示了与您的代码类似的错误。

    在 rts430x_lc_sd_eabi.lib->boot.c 中、似乎有未解析的符号

    您可能需要在 Code Composer Studio 子论坛中创建一个新主题、 以提出您的问题。