工具/软件:TI C/C++编译器
您好、先生、
请帮我解决问题、我希望从连接在 msp430f67791A I2C 上的 EEPROM 发送和接收数据、这里使用 i2c 从器件到 MSP430主器件的示例代码不起作用、这是我所需要的、 但 为 I2C 主设备到 MSP430从设备提供的示例代码的工作原理是、我能够发送数据、但无法从 MSP430 I2C 中断子例程(ISR)上的 EEPROM 接收任何数据。 我在下面附上我的代码、请给我同样的建议。
// MSP430F67791A 演示- USCI_B0 I2C 主设备 TX 单个字节到 MSP430从设备
//
//说明:此演示通过 I2C 总线连接两个 MSP430。 主器件
//发送到从设备。 这是主代码。 它会持续运行
//传输00h、01h、...、0ffh 并演示如何实现 I2C
//主发送器使用 eUSCI_B0 TX 中断发送单个字节。
// ACLK = n/a、MCLK = SMCLK = BRCLK =默认 DCO =~1.045MHz
//
///|\/|\
// MSP430F67791A 10k MSP430F67791A
//从器件||主器件
//------------ |||---
//-|XIN P2.6/UCB0SDA|-|--+-|P2.6/UCB0SDA XIN|-
//|||||
//-|XOUT ||| XOUT|-
//| P2.5/UCB.S.|<---- |P2.5/UCB.S.|
//||||
//
/ E. Chen
// Texas Instruments Inc.
/2014年1月
//使用 CCS 版本:5.5.0和 IAR Embedded Workbench 版本:5.52进行编译
//
#include
unsigned char TXData;
unsigned char TXByteCtr;
unsigned char * PRxData;//指向 RX 数据的指针
unsigned char RXByteCtr;
volatile unsigned char RxBuffer[5];//分配5字节 RAM
unsigned int flag=0;
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
//设置 P2.5 UCB.S.、P2.6 UCB0SDA
P2SEL0 |= BIT5 | BIT6;//将 P2.5、P2.6设置为 UCB.S、UCB0SDA
//设置 eUSCI_B0发送
UCB0CTLW0 |= UCSWRST;//启用软件复位
UCB0CTLW0 |= UCMST | UCMODE_3 | UCSSEL_2;// I2C 主设备、使用 SMCLK
UCB0BRW_L = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BRW_H = 0;
UCB0I2CSA = 0x0000;//从器件地址为048h
UCB0CTLW0 &=~UCSWRST;//清除软件复位,恢复操作
UCB0IE |= UCTXIE0 | UCRXIE0;//启用 TX 中断
TXData = 0x01;//保留 TX 数据
//////设置 eUSCI_B0接收
// UCB0CTLW0 |= UCSWRST;//启用软件复位
// UCB0CTLW0 |= UCMST | UCMODE_3 | UCSSEL_2;// I2C 主设备,同步模式
// UCB0BRW_L = 12;// fSCL = SMCLK/12 =~100kHz
// UCB0BRW_H = 0;
// UCB0I2CSA = 0x48;//从地址为048h
// UCB0CTLW0 &=~UCSWRST;//清除 SW 复位,恢复操作
// UCB0IE |= UCRXIE0;//启用 RX 中断
_bis_SR_register (GIE);//输入 LPM0、带中断
if (flag==0)
TXByteCtr = 1;
while (1)
{
//加载 TX 字节计数器
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
if (flag==1)
{
flag=0;
UCB0IFG &=~UCRXIFG;
UCB0IE |= UCRXIE0;
PRxData =(unsigned char *) RxBuffer;// RX 缓冲区开始
RXByteCtr = 5;//加载 RX 字节计数器
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTLW0 |= UCTXSTT;// I2C 启动条件
}
_bis_SR_register (GIE);//输入 LPM0、带中断
_NO_OPERATION ();//保持在 LPM0中直到所有数据
//是 TX
TXData++;//递增数据字节
}
}
///----------------------------------
// USCIAB0_ISR 的结构使其可用于传输任何数据
//预加载带有字节计数的 TXByteCtr 的字节数。
///----------------------------------
// USCI_B0中断服务例程
#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__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif
{
开关(_偶数_在范围内(UCB0IV、30))
{
案例 USCI_NONE:中断;//无中断
案例 USCI_I2C_UCALIFG:中断;// ALIFG
案例 USCI_I2C_UCNACKIFG:中断;// NACKIFG
案例 USCI_I2C_UCSTTIFG:中断;// STTIFG
案例 USCI_I2C_UCSTPIFG:中断;// STPIFG
USCI_I2C_UCRXIFG3案例:中断;// RXIFG3
USCI_I2C_UCTXIFG3案例:中断;// TXIFG3
USCI_I2C_UCRXIFG2案例:中断;// RXIFG2
USCI_I2C_UCTXIFG2案例:中断;// TXIFG2
USCI_I2C_UCRXIFG1案例:中断;// RXIFG1
USCI_I2C_UCTXIFG1案例:中断;// TXIFG1
案例 USCI_I2C_UCRXIFG0:// RXIFG0
RXByteCtr --;//递减 RX 字节计数器
IF (RXByteCtr)
{
* PRxData++= UCB0RXBUF;//将 RX 数据移动到地址 PRxData
如果(RXByteCtr = 1)//只剩下一个字节?
UCB0CTLW0 |= UCTXSTP;//生成 I2C 停止条件
}
其他
{
* PRxData = UCB0RXBUF;//将最终的 RX 数据移动到 PRxData
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
}
中断;
案例 USCI_I2C_UCTXIFG0:// TXIFG0
if (TXByteCtr)//检查 TX 字节计数器
{
UCB0TXBUF = TXData;//加载 TX 缓冲区
TXByteCtr -;//减量 TX 字节计数器
}
其他
{
UCB0IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
UCB0CTL1 |= UCTXSTP;// I2C 停止条件
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
flag=1;
}
中断;
案例 USCI_I2C_UCBCNTIFG:break;// CNTIFG
USCI_I2C_UCCLTOIFG 案例:中断;// LTOIFG
案例 USCI_I2C_UCBIT9IFG:中断;// BIT9IFG
默认值:break;
}
}
此致、
扭结