主题中讨论的其他器件: MSP430WARE
尊敬的 Sirs:
发现我必须使用中断来发送一个从器件地址和一个数据字节。 因此、在我的简单示例中添加了中断。
程序会发送从地址、但从不发送数据=200dec。 如果我在中断例程的顶部放置一个断点、它也会发送
一个停止条件、否则它只发送从器件地址。 在我看来、它符合手册中的示例、但仍然无法正常工作。
有什么想法吗?
谢谢、 John
代码:
#include
unsigned int TXByteCtr;
unsigned char *pTxData;
Int A;
typedef unsigned char uint8;
/*********
测试 I2C MSP430FR5994
使用中断的简单 I2C 发送器。 用于写入电子电位计。
将 I2C TxData 输出 P5.0和 P5.1
最初来自 Dang
秘书长的报告 /
int main (空)
{
int i;
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
PM5CTL0 &=~LOCKLPM5;//默认情况下禁用 GPIO 电源
UCB1CTL1 |= UCSWRST;//启用 SW 复位
P5SEL0 |= BIT0;//UCB1SIMO
P5SEL0 |= BIT1;//UCB1SOMI
//P5SEL0 |= BIT3;//UCB1STE (从器件 TX 使能)
P5SEL1 &=~BIT0;//UCB1SIMO
P5SEL1 &=~BIT1;//UCB1SOMI
//P5SEL1 &=~BIT3;//UCB1STE (从器件 TX 启用)
//UCMODE_3设置 I2C 模式
UCB1CTLW0 |=(UCMST + UCMODE_3 + UCTR);// I2C 主设备、I2C、发送器
UCB1CTLW1 = UCASTP_2;//自动停止有效
UCB1BRW = 8;// fSCL = SMCLK/12 =~100kHz
UCB1TBCNT = 2;// 2字节数据
//UCB1BR1 = 0;
UCB1I2CSA = 0x1;//从器件地址为1AH
UCB1CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
UCB1IE |= UCTXIE;//为 UCB1IE 启用 TX 中断
ENABLE_INTERRUPTS ();//全局 IE
TXByteCtr = 1;//加载 TX 字节计数器
UCB1TXBUF = 200;//使用 POT 值加载 TX 缓冲器
UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件此传输! UCTR 是 UCBxCTLW0的位4 (0x10)
while (1)
{
// while (UCB1CTL1 & UCTXSTP);//确保发送了 STOP 条件
// UCB1CTL1 |= UCTR + UCTXSTT;// I2C TX,启动条件
//__bis_SR_register (CPUOFF + GIE);//输入 LPM0并带有中断
//保持在 LPM0中直到所有数据
A=a+1;//是 TX
循环:
// UCB1TXBUF = TxData;//加载新的 TX 缓冲区!!
for (i=0;i<10000;i++)//发送时的延迟
A=a+1;
}
}
///----------------------------------
// USCIAB0TX_ISR 的结构使其可用于传输任何数据
//预加载带有字节计数的 TXByteCtr 的字节数。
//
///----------------------------------
//#pragma vector = USCI_B1_vector
//_INTERRUPT void ISR_USCI_B1 (void){
#pragma vector = USCI_B1_Vector
_interrupt void USCI_B1_ISR (void){
静态 int IFlags;
IFlags = UCB1IFG;
if (TXByteCtr)//检查 TX 字节计数器
{
UCB1TXBUF = 200;//加载 TX 缓冲器
TXByteCtr -;//减量 TX 字节计数器
IFlags = UCB1IFG;
UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件
UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志
}
其他
{
UCB1CTL1 |= UCTXSTP;// I2C 停止条件
UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志
//_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
}
}