主题中讨论的其他器件:MSP430G2553、、 RF430CL330H、 RF430CL331H
工具/软件:Code Composer Studio
您好!
我在 MSP430G2553和 MSP430FRL152H 之间的 I2C 通信中遇到问题。 我将 MSP430FRL152H 用作从器件。
对于主站:我从 \slac485j\MSP430G2xx3_Code_examples\C\msp430g2xx3_uscib0_i2c_08.c 中选择了示例代码
/*-版权所有-、BSD_EX *版权所有(c) 2012、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 * *** * * MSP430代码示例免责声明 * * MSP430代码示例是自包含的低级程序 ,通常*以 高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认 值*寄存器值和时钟配置等设置、 并且在组合多个示例中的代码时必须*小心以避免潜在的副作用 *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware *了解外设配置的 API 函数库方法。 * *--/版权--* //********* // MSP430G2xx3演示- USCI_B0 I2C 主器件 TX 多个字节到 MSP430从器 件// //说明:此演示通过 I2C 总线连接两个 MSP430。 主 器件//发送到从器件。 这是主代码。 它持续 //传输一组数据并演示如何使用 USCI_B0 TX 中断实现发送多个字节的 I2C //主发送器。 // ACLK = n/a、MCLK = SMCLK = BRCLK =默认 DCO =~1.2MHz // //***与"msp430g2xx3_uscib0_i2c_09.c"*** // /|\/|\ // MSP430G2xx3. 10k 10k MSP430G2xx3 // 从器件 || 主器件 // -------- |||--- // -|XIN P3.1/UCB0SDA|-|--+->|P3.1/UCB0SDA XIN|- // | || | | // -|XOUT || | XOUT|- // | P3.2/UCB.S.|<---- >|P3.2/UCB.S. | // | | | |//// D. Dang // Texas Instruments Inc. // 2011年2月 //使用 CCS 版本4.2.0和 IAR Embedded Workbench 版本构建:5.10 //********* #include unsigned char * PTxData; //指向 TX 数据 的指针 unsigned char TXByteCtr; const unsigned char TxData[]= //要发送 的数据表{ 0x11、 0x22、 0x33、 0x44、 0x55 }; int main (void) { WDTCTL = WDTPW + WDTHOLD; //停止 WDT P1SEL |= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0 P1SEL2|= BIT6 + BIT7; //将 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 复位,恢复操作 IE2 |= UCB0TXIE; //启用 TX 中断 while (1) { PTxData =(unsigned char *) TxData; // TX 数组起始地址 TXByteCtr = TxData 的大小; //加载 TX 字节计数器 while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件 UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件 _bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0 //保持在 LPM0中直到所有数据 //是发送 的} }-->----------------- // USCIAB0TX_ISR 的结构使其可用于通过 预加载带有字节计数的 TXByteCtr 来发送任何//字节数。 此外、TXData //指向要发送的下一个字节。 ///---------------------------------- #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector = USCIAB0TX_Vector __interrupt void USCIAB0TX_ISR (void) #Elif defined (__GNU__) void __attribute__((interrupt (USCIAB0TX_ISR)#vector (void USCIA0TX_ISR)#UCIAB0TX_ISR (void))#defineer_COMPLETE!错误!#UICUICUICUICUICU #endif { if}(TXByteCtr) //检查 TX 字节计数 器{ UCB0TXBUF =* PTxData++; //加载 TX 缓冲区 TXByteCtr --; //减量 TX 字节计数 器} 否则 { UCB0CTL1 |= UCTXSTP; // I2C 停止条件 IFG2 &=~UCB0TXIFG; //清除 USCI_B0 TX int 标志 _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0 }
对于从机:源代码:
/* * main.c * * RF430FRL152H 仅 NFC 示例项目 * *版权所有(C) 2014德州仪器(TI)公司- http://www.ti.com/ * **允许以源代码和二进制形式重新分发和使用 (无论是否进行*修改),前提是 满足以下条件*: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * *二进制形式的再发行必须在 * 发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * *未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件派生的产品*。 * *本软件由版权所有者和贡献者 *按原样"提供、 且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权 *所有者或贡献者都不对任何直接、间接、偶然、 *特殊、模范、 或相应的损害(包括但不 限于*采购替代产品或服务;丧失使用、 *数据或利润; 或业务中断)、但出于 任何*责任理论、无论是合同、严格责任还是侵权 行为*(包括疏忽或其他原因)、即使 被告知可能会造成此类损坏、也是出于此类责任理论。 * */ #include "NDEF.h" #include "types.h" #include "patch.h" #include #define PORT_I2C_OUT P1OUT #define PORT_I2C_DIR P1DIR #define PORT_I2C_SEL0 P1SEL0 #define PORT_I2C_SEL1 P1SEL1 #define SDA BIT0 #define SCL BIT1 //********* 函数原型******** / void DeviceInit(void); //******** / #pragma RETAIN (PRxData); unsigned char * PRxData; //指向 RX 数据的指针 #pragma RETAIN (RXByteCtr); unsigned char RXByteCtr; #pragma RETAIN (RxBuffer); volatile unsigned char RxBuffer[128]; //分配128字节的 RAM void I2C_init (void); void main () { WDTCTL = WDTPW + WDTHOLD; //停止看门狗 // ROM RF13M 模块设置**正确的 RF 堆栈操作需要以下三行 DS = 1;//需要在此处初始化 ROM 变量 ASM ("调用#0x5CDA ");//调用 ROM 函数(初始化函数指针) asm ("调用#0x5CAC ");//调用 ROM 函数(检查器件配置) initISO15693 (clear_block_locks);//清除所有块锁定 //initISO15693 (0);//将块锁定保留为在 FRAM 中设置// JTAG 设置为在该函数调用 CopyInit()中禁用;//CopyDeviceInit() ;//FRAMI2C ;CopyDeviceIntoI2C; _bis_SR_register (GIE); while (1) { PRxData =(unsigned char *) RxBuffer;// RX 缓冲区开始 RXByteCtr = 0; //清除 RX 字节计数 __bis_SR_register (LPM3_bits + GIE); } / *DeviceInit * *简介:初始化时钟系统和其他设置 * patchable function * * param[in]:parameters:具有这些独立选项 * Initialize_device_clock_system -初始化时钟系统 * populate_interrupt_vector_in_initialization -填充默认中断矢量并重新计算其 CRC * param[out]:无 * 返回无 * *可修补:是 / void DeviceInit (void) { P1SEL0 = 0xF0;//保留 JTAG P1SEL1 = 0xF0;//保留 JTAG //P1SEL0 = 0x00;//无 JTAG //P1SEL1 = 0x00;//无 JTAG P1DIR &=~0xEF; P1REN = 0; CCSCTL0 = CCSKEY; //解锁 CCS CCSCTL1 = 0; //时钟速度不要减半 CCSCTL4 = SELA_1 + SELM_0 + SELS_0; //为 ACLK 选择 VLO 并为 MCLK 和 SMCLK 选择 HFCLK/DCO CCSCTL5 = DIVA_2 + DIVM_1 + DIVS_1; //将 ACLK (4)、MCLK 和 SMCLK 的分频器设置为1 CCSCTL6 = XTOFF; //如果不使用晶振、则将其旋转 CCSCTL8 = ACLKREQEN + MCLKREQEN + SMCLKREQEN;//如果未使用时钟、则禁用时钟 CCSCTL0_H |= 0xFF; //锁定 CCS 返回; } void I2C_init (void) { //ROM 设置 P1OUT = 0x0F、然后消耗一些电流 P1OUT = 0x00;//需要降低 RF430FRL152H EVM 的功耗、因为 P1.3连接到 EVM 上的2.2K 欧姆电阻接地 //为 I2C 模式配置 P1.0和 P1.1引脚 PORT_I2C_SEL0 |= SCL + SDA; PORT_I2C_SEL1 &=~Ω(SCL + SDA); UCB0CTL1 |= UCSWRST;// eUSCI_B 处于复位状态 UCB0CTLW0 |= UCMODE_3;// I2C 从模式 UCB0I2COA0 = 0x0048;//自身地址为12十六进制 // P2SEL |= 0x03;//配置 I2C 引脚(特定于器件) UCB0CTL1 &=~UCSWRST;// eUSCI_B 处于运行状态 // UCB0IE |= UCTXIE + UCRXIE;//启用 Tx&RX-INTERRUPT UCB0IE |= UCTXIE; _bis_SR_register (GIE);//常规中断使能 return; } #pragma vector = RF13M_vector __interrupt void RF13M_ISR (void) { switch (__evo_in_range (UCB0IV、0x1E)){ 情况0x00://向量0:无中断 中断; 情况0x16://向量22:RXIFG0 UCB0STAT &=~(UCSTPIFG + UCSTTIFG); //清除中断标志 IF (RXByteCtr) //检查 RX 字节计数器 // _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //如果数据是,则退出 LPM0 _BIC_SR_REGISTER_ON_EXIT (LPM0_Bits | GIE);//退出 LPM0 中断; 情况0x18://向量24:TXIFG0 * PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData RXByteCtr +; //增加 RX 字节计数 中断; 默认值:break; } }
我 无法接收 T2C Rx/Tx 中断。 在 SCL 和 ADA 引脚上,30k 上拉电阻连接到主端(EXP430G2 lanch pad),2.2K 上拉电阻连接到从端(RF430FRL152HEVM 电路板)。
请提供任何提示以继续。
谢谢、
AG



