尊敬的 Sirs:
我正在尝试制作一个简单的 I2C 主发送器来设置数字电位器。 我有一个尝试符合的简单示例代码
用户手册中的一个、例如32-1。 它将 P5.0用于 SDA、将 P5.1用于 SCLK。 我使用 MSP-EXP 430FR5994 (评估板)进行检查。
它目前还不使用中断。 在 P5.0或 P5.1上使用示波器运行时、根本没有信号。
可以有人快速查看并纠正我的问题吗?
谢谢 、John Moore
示例代码:
#include
Int A;
/*********
测试 I2C MSP430FR5994
简单 I2C 发送器不使用中断。 用于写入电子电位计。
将 I2C TxData 输出 P5.0和 P5.1
最初来自 Dang
秘书长的报告 /
unsigned char TXData;
unsigned char TXByteCtr;
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;// I2C 主设备、I2C、
UCB1CTLW1 = UCASTP_2;//自动停止有效
UCB1BRW = 8;// fSCL = SMCLK/12 =~100kHz
UCB1TBCNT = 7;// 7位数据
//UCB1BR1 = 0;
UCB1I2CSA = 0x1A;//从器件地址为1AH
UCB1CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
// UCB1IE |= UCTXIE1;//为 UCB1IE 启用 TX 中断
TXData = 0x00;//保留 TX 数据
UCB1CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
while (1)
{
TXByteCtr = 1;//加载 TX 字节计数器
// while (UCB1CTL1 & UCTXSTP);//确保发送了 STOP 条件
// UCB1CTL1 |= UCTR + UCTXSTT;// I2C TX,启动条件
//__bis_SR_register (CPUOFF + GIE);//输入 LPM0并带有中断
//保持在 LPM0中直到所有数据
//是 TX
//发送循环(无中断):
UCB1TXBUF = TXData;//加载 TX 缓冲区新!!
for (i=0;i<10000;i++)//发送时的延迟
A=a+1;
TXData++;//递增数据字节
}
}
///----------------------------------
// USCIAB0TX_ISR 的结构使其可用于传输任何数据
//预加载带有字节计数的 TXByteCtr 的字节数。
//目前未使用
///----------------------------------
#pragma vector = USCIAB1TX_vector
_interrupt void USCIAB1TX_ISR (void)
{
A=a+1;
if (TXByteCtr)//检查 TX 字节计数器
{
UCB1TXBUF = TXData;//加载 TX 缓冲区
TXByteCtr -;//减量 TX 字节计数器
}
其他
{
UCB1CTL1 |= UCTXSTP;// I2C 停止条件
UCB1IFG &=~UCTXIFG1;//清除 USCI_B1 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
}
}