工具与软件:
我们使用 I2C 通信将 PCF8563与 msp430fr6928连接、但不会生成 I2C 中断。 此处附上代码片段以供参考、请更正我以继续。
void fnInitRTC()
{
// RTCCTL0_H = RTCKEY_H;//解锁 RTC_C 模块
P3SEL0 |=位1 |位2;
P3SEL1 &=~Ω(BIT1 | BIT2);
P3DIR |=BIT0;
P3OUT &=~Ω(BIT0);
PM5CTL0 &=~μ H LOCKLPM5;
UCB1CTLW0 = UCSWRST;//启用软件复位
UCB1CTLW0 |= UCMODE_3 | UCMST | UCSSEL__SMCLK | UCSYNC;// I2C 主模式、SMCLK
UCB1BRW = 160;// fSCL = SMCLK/160 =~100kHz
UCB1I2CSA = 0xA2;//从器件地址
UCB1CTLW0 &=~μ s UCSWRST;//清除软件复位、恢复操作
UCB1IE |= UCNACKIE;
数据= 0x00;
I2C_4.54 Master_Write (RTC_WR_ADDR、CTRL1、&DATA、1);
//__delay_cycles (5500);
DATA=0x12;
I2C_4.54 Master_Write (RTC_WR_ADDR、CTRL2、和 DATA、1);
//_delay_cycles (5500);
数据= 0x01;
I2C_4.54 Master_Write (RTC_WR_ADDR,MINA,&DATA ,1);
//__delay_cycles (5500);
数据= 0x80;
I2C_4.54 Master_Write (RTC_WR_ADDR、HRSA、&DATA、1);
//__delay_cycles (5500);
数据= 0x80;
I2C_4.54 Master_Write (RTC_WR_ADDR、Daya、&DATA、1);
//_delay_cycles (5500);
数据= 0x80;
I2C_4.54 Master_Write (RTC_WR_ADDR、Weka、&DATA、1);
__delay_cycles (5500);
DATA=0x82;
I2C_4.54 Master_Write (RTC_WR_ADDR、CLK、&DATA、1);
__delay_cycles (5500);
数据= 0x00;
I2C_4.54 Master_Write (RTC_WR_ADDR、TIMER、&DATA、1);
__delay_cycles (5500);
数据= 0x01;
I2C_4.54 Master_Write (RTC_WR_ADDR、TIMERV、&DATA、1);
__delay_cycles (5500);
}
void I2C_54 Master_Write (unsigned char dev_addr、unsigned int reg_addr、unsigned char * reg_data、unsigned char count)
//I2C_Mode I2C_LaunchPad Master_Write (uint8_t dev_addr、uint8_t reg_addr、uint8_t * reg_data、uint8_t count)
{
UCB1I2CSA = dev_addr;
UCB1IFG 并且=~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
UCB1IE &&~μ P UCRXIE;//禁用 RX 中断
UCB1IE |= UCTXIE;//启用 TX 中断
UCB1CTLW0 |= UCTR + UCTXSTT;// I2C TX、启动条件
___ enable_interrupt ();
__bis_SR_register (LPM0_bits + GIE);
___ no_operation();
}
void I2C_ECG Master_Read (unsigned char dev_addr、unsigned char reg_addr、unsigned char 计数)
{
/*初始化从机地址和中断*/
UCB1I2CSA = dev_addr;
UCB1IFG 并且=~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
UCB1IE &&~μ P UCRXIE;//禁用 RX 中断
UCB1IE |= UCTXIE;//启用 TX 中断
UCB1CTLW0 |= UCTR + UCTXSTT;// I2C TX、启动条件
___ enable_interrupt ();
__bis_SR_register (LPM0_bits /*+ GIE*/);
}
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B1_VECTOR
_interrupt void USCI_B1_ISR (void)
#elif defined (_GNUC__)
void __attribute__(((interrupt (USCI_B0_vector))) USCI_B1_ISR (void)
#else
错误编译器不受支持!
#endif
必须从 UCB2RXBUF 读取
{
//putch ('B');
unsigned char rx_val = 0;
开关(__EVEN_IN_RANGE (UCB1IV、USCI_I2C_UCBIT9IFG))
{
case USCI_NONE:break;//向量0:无中断
case USCI_I2C_UCALIFG:break;// Vector 2:ALIFG
case USCI_I2C_UCNACKIFG:// Vector 4:NACKIFG
// UCB1CTLW0 |= UCTXSTT;//如果无应答、则重新发送启动
休息;
case USCI_I2C_UCSTTIFG:break;// Vector 6:STTIFG
case USCI_I2C_UCSTPIFG:break;// Vector 8:STPIFG
case USCI_I2C_UCRXIFG3:break;// Vector 10:RXIFG3
case USCI_I2C_UCTXIFG3:break;// Vector 12:TXIFG3
case USCI_I2C_UCRXIFG2:break;// Vector 14:RXIFG2
case USCI_I2C_UCTXIFG2:break;// Vector 16:TXIFG2
case USCI_I2C_UCRXIFG1:break;// Vector 18:RXIFG1
case USCI_I2C_UCTXIFG1:break;// Vector 20:TXIFG1
案例 USCI_I2C_UCRXIFG0:
// Vector 22:RXIFG0
Rx_val = UCB1RXBUF;
IF (RXByteCtr)
{
ReceiveBuffer[ReceiveIndex++]= Rx_val;
RXByteCtr --;
}
if (RXByteCtr =1)
{
UCB1CTLW0 |= UCTXSTP;
}
否则为(RXByteCtr =0)
{
UCB1IE &=~UCRXIE;
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
}
休息;
案例 USCI_I2C_UCTXIFG0:
if (TXByteCtr)//检查 TX 字节计数器
{
UCB1TXBUF = TransmitBuffer[TransmitIndex++];// TXData[SlaveFlag];//加载 TX 缓冲区
TXByteCtr --;//递减 TX 字节计数器
}
设计
{
UCB1CTLW0 |= UCTXSTP;// I2C 停止条件
UCB1IFG 并且=~UCTXIFG;//清除 USCI_B0 TX int 标志
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
}
休息;
默认值:中断;
}
}