主题中讨论的其他器件:BQ34Z100
#include
#define BQ34Z100_ADDR 0xAA // BQ34Z100地址
#define SOH_ADDR_MSB 0x02 // SOH MSB 地址
#define SOH_ADDR_LSB 0x03 // SOH LSB 地址
Volatile unsigned char RXData;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//关闭看门狗计时器
//配置 GPIO
P1OUT &&~BIT0;//清除 P1.0输出保持器
P1DIR |= BIT0;// LED 的方向为输出
P1SEL0 |= BIT6 | BIT7;// I2C 端口
//关闭启动时默认的高阻抗模式,以激活之前配置的端口设置
PM5CTL0 &=~μ A LOCKLPM5;
//配置 USCI_B0模块为 I2C 模式
UCB0CTLW0 |= UCSWRST;//软件复位使能
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C 模式、主机模式和同步操作
UCB0BRW = 0x0008;//波特率设置为 SMCLK / 8
UCB0CTL1 &=~UCSWRST;//复位结束
UCB0IE |= UCRXIE | UCNACKIE;//使能接收中断和 NACK 中断
while (1)
{
__个周期 delay_cycles (2000);//等待2000 μ s
//发送 I2C 启动条件
// while (UCB0CTL1 & UCTXSTP);//确保停止信号已发送
UCB0CTL1 |= UCTR | UCTXSTT;//写入模式的 I2C 启动条件
// while (UCB0CTL1 & UCTXSTT);//等待启动条件完成
发送地址和寄存器地址 BQ34Z100 μ A
UCB0TXBUF = BQ34Z100_ADDR << 1;//发送 BQ34Z100的写地址
// while (!(UCB0IFG & UCTXIFG));//等待传输缓冲区为空
UCB0TXBUF = SOH_ADDR_MSB;//发送 SOH MSB 地址
// while (!(UCB0IFG & UCNACKIFG));//等待从设备应答
//发送重复启动条件并读取 BQ34Z100中的 SOH 数据 Ω
// while (UCB0CTL1 & UCTXSTP);//确保停止信号已发送
UCB0CTL1 &=~μ A UCTR;//切换到读取模式 μ A
UCB0CTL1 |= UCTXSTT;//重复启动条件
// while (UCB0CTL1 & UCTXSTT);//等待重复启动条件完成
UCB0CTL1 |= UCTXSTP;//第一次接收数据后停止 I2C 通信
//退出 ISR 前的延迟
___ no_operation();
//进入 LPM0模式,并启用全局中断
__ bis_SR_register (LPM0_bits|gie);
}
}
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B0_vector
__interrupt void USCIB0_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (USCI_B0_vector))) USCIB0_ISR (void)
#else
#错误编译器不受支持!
#endif
{
开关(__even_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))
{
用例 USCI_NONE:
中断;
案例 USCI_I2C_UCNACKIFG:
UCB0CTL1 |= UCTXSTT;// NACK 接收后重新启动条件
中断;
情况 USCI_I2C_UCRXIFG0:
RXData= UCB0RXBUF;//读取接收到的数据
__ bic_SR_register_on_exit (LPM0_bits);//退出 LPM0模式
中断;
默认值:
中断;
}
}