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.
工具/软件:Code Composer Studio
TI_USCI_I2C_receiveinit (0x48、0x12);
void TI_USCI_I2C_receiveinit (unsigned char slave_address、 unsigned char 预分频){ P3SEL |= SDA_PIN + SCL_PIN; //将 I2C 引脚分配给 USCI_B0 UCB0CTL1 = UCSWRST; //启用 SW 复位 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式 UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位 UCB0BR0 =预分频; //设置预分频 器 UCB0BR1 = 0; UCB0I2CSA = SLAVE_ADDRESS; //设置从地址 UCB0CTL1 &=~UCSWRST; //清除 SW 复位、恢复运行 UCB0IE = UCNACKIE; UCB0IE = UCRXIE; //启用 RX 中断 }
之后调用接收函数、这里是该函数的函数
TI_USCI_I2C_Receive (3、array2); void TI_USCI_I2C_Receive (unsigned char byteCount、unsigned char * field){ TI_receive_field = field; if (byteCount = 1){ byteCtr = 0; _disable_interrupt (); UCB0CTL1 |= UCTXSTT; // I2C 启动条件 while (UCB0CTL1 & UCTXSTT); //起始条件是否已发送? UCB0CTL1 |= UCTXSTP; // I2C 停止条件 __ENABLE_INTERRUPT(); }否则(byteCount >1){ byteCtr = byteCount -2; UCB0CTL1 |= UCTXSTT; // I2C 起始条件 }否则 while (1); //非法参数 }
如果有人能帮助我解决 i2c 的问题,我会非常感激。以上是2张图片,可以帮助解释我的问题。收到第一个字节后,数据线就会保持高电平。 左侧是我使用 MSP430F5529获得的结果、右侧是我使用 Arduino 获得的结果、我使用一些示例代码进行了调试。 我认为这更像我应该得到的东西。有人知道我做了什么错误,还是有我应该尝试的示例代码? 如果您需要头文件或 c 文件、请告诉我。
您好!
我看到了这两个代码片段、但我没有看到您所指的其他图片。 通常、TI 在 TI Resource Explorer 中提供 I2C 示例 、以帮助客户正确初始化 I2C 模块并启动和运行 I2C 通信。 导入我刚才提供的一个 USCI I2C 代码示例、并浏览其中、了解需要修改代码示例的内容以满足您的特定需求、例如修改从器件地址。
在尝试将一个 Launchpad 连接到 ADS1100之前、让示例与2个 Launchpad 一起运行可能是有益的。
此致、
Matt
感谢您的回复。 我现在确实让它工作了… 我将添加我最终使用的代码和逻辑分析仪的图片、以显示我得到的结果。 我不知道我上次尝试添加的照片发生了什么。 我的下一个问题可能有点偏离主题、但您是否知道我如何将该结果转换为16位值?
/*-版权所有-、BSD_EX *版权所有(c) 2012、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 * *** * * MSP430代码示例免责声明 * * MSP430代码示例是自包含的低级程序 ,通常*以 高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认 值*寄存器值和时钟配置等设置、 并且在组合多个示例中的代码时必须*小心以避免潜在的副作用 *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware *了解外设配置的 API 函数库方法。 * *--/版权--* //********* // MSP430F552x 演示- USCI_B0 I2C 主设备 RX 多个来自 MSP430从设备的字节 // //说明:此演示通过 I2C 总线连接两个 MSP430。 从 器件//发送到主器件。 这是主代码。 它持续 //接收一组数据并演示如何使用 USCI_B0 TX 中断实现接收多个字节的 I2C //主接收器。 // ACLK = n/a、MCLK = SMCLK = BRCLK =默认 DCO =~1.045MHz // ***与"MSP430F55xx_uscib0_i2c_11.c"***一起使用 /|\/|\ // MSP430F5529 10k 10k MSP430F5529 // 从器件 || 主器件 // -------- |||--- // -|XIN P3.0/UCB0SDA|-|-|-+->|P3.0/UCB0SDA XIN|- // | || | | // -|XOUT || | XOUT|- // | P3.1/UCB.S.|<---- >|P3.1/UCB.S. | // | | | |//// Bhargavi Nisarga // Texas Instruments Inc. // 2009年4月 //使用 CCSv4和 IAR Embedded Workbench 构建版本:4.21 //********* #include unsigned char * PRxData; //指向 RX 数据 的指针 unsigned char RXByteCtr; volatile unsigned char RxBuffer[2]; //分配128字节的 RAM int main (void) {P6DIR |= 0x01; WDTCTL = WDTPW + WDTHOLD; //停止 WDT P3SEL |= 0x03; //将 I2C 引脚分配给 USCI_B0 UCB0CTL1 |= UCSWRST; //启用 SW 复位 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式 UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位 UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz UCB0BR1 = 0; UCB0I2CSA = 0x48; //从器件地址为048h UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作 UCB0IE |= UCRXIE; //启用 RX 中断 while (1) { PRxData =(unsigned char *) RxBuffer;// RX 缓冲区开始 RXByteCtr = 2; //加载 RX 字节计数器 while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件 UCB0CTL1 |= UCTXSTT; // I2C 启动条件 _bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断 //保持在 LPM0中直到所有数据 //是 RX __no_operation(); //设置断点>>此处<<和 } //读出 RxBuffer 缓冲区}--><!--kadov_tag{</spaces>}}--> // USCI_B0数据 ISR 用于将接收到的数据从 I2C 从器件//移动 到 MSP430存储器。 它的结构使得它能够通过 预先载入带有字节计数的 RXByteCtr 来被用来接收//任一2+数量的字节。 ///---------------------------------- #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector = USCI_B0_vector __interrupt void USCI_B0_ISR (void) #Elif defined (__GNU__) void __attribute__(interrupt (USCI_B0_vector)#USCI_ISR vector (void )(void)#USCI_ISR vector 0! #endif { switch (__even_in_range (UCB0IV、12)) { case 0:break; //向量0:无中断 情况2:中断; //向量2:ALIFG 情况4:中断; //向量4:NACKIFG 情况6:中断; //向量6:STTIFG 情况8:中断; //向量8:STPIFG 情况10: //向量10:RXIFG RXByteCtr---; //递减 RX 字节计数器 IF (RXByteCtr) { * PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData IF (RXByteCtr = 1) //只剩下一个字节? UCB0CTL1 |= UCTXSTP; //生成 I2C 停止条件 } 其他 { * PRxData = UCB0RXBUF; //将最终 RX 数据移动到 PRxData __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);//退出活动 CPU } 中断; 案例12:中断; //向量12:TXIFG 默认值:break; }
您好!
为了将结果转换为16位值、必须声明"int"变量并将结果复制到该变量中。
此致、
Matt