您好,
我正在使用msp430f5659微控制器。 我正在尝试通过I2C协议连接DS1307 RTC IC。 我使用了TI为msp430f6和F6系列提供的示例代码的i2c发送和接收函数。 我正在传输(0xD0,0x00,0x01设置秒数,0xD0,0x00,0xD1读取第二个数据)。 数据传输成功,但我正在接收0xFF,这是垃圾数据。 如果发送任何其他命令以接收分钟或小时,则始终发送0xFF。 我无法检测到代码中的问题。我的代码在这里。
void i2c_transmit (无符号char TxData)
{
无符号char i=0;
PTxData =&TxData;
TXByteCtr = TxData的大小; //加载TX字节计数器
I2C_writeinit();// 它启用TX中断标志
对于(i=0;i<1;i++)
{
UCB1CTL1 || UCTR | UCTXSTT; // I2C TX,启动条件
__bis_sr_register( GIE); //输入LPM0,启用中断
while (UCB1CTL1和UCTXSTP); //确保已发送停止条件
}
}
void i2c_receive()
{
int i;
I2C_readinit();// 它启用rxinterrupt标志
PRxData = RxBuffer; // RX缓冲区开始
对于(i=0;i<1;i++)
{
while (UCB1CTL1和UCTXSTP); //确保已发送停止条件
UCB1CTL1 || UCTXSTT; // I2C启动条件
__bis_sr_register(LPM0_bits | GIE); //输入LPM0,启用中断
//保留在LPM0中,直到所有数据
//为RX
}
UART_PUTSTRING (RxBuffer,1); //在UART上接收0xFF
}
// USI_B1数据ISR
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B1_Vector
__interrupt void USI_B1_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B1_vector))) USI_B1_ISR (void)
#否则
错误编译器不受支持!
#endif
{
SWITCH(__EIV_IN_RANGE(UCB1IV,12))
{
案例 0:中断; //矢量 0:无中断
案例 2:中断; //矢量 2:ALIFG
案例 4:中断; //矢量 4:NACKIFG
案例 6:中断; //矢量 6:STTIFG
案例 8:中断; //矢量 8:STPIFG
案例10:
RXByteCtr --; // Decrement RX字节计数器
IF (RXByteCtr)
{
*PRxData++= UCB1RXBUF; //将RX数据移动到PRxData地址
如果(RXByteCtr == 1) //只剩下一个字节?
UCB1CTL1 || UCTXSTP; //生成I2C停止条件
}
否则
{
*PRxData = UCB1RXBUF; //将最终RX数据移至PRxData
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出活动CPU
}
中断;
案例12:
IF (TXByteCtr) //检查TX字节计数器
{
UCB1TXBUF =* PTxData; //加载TX缓冲区
TXByteCtr -; // Decrement TX字节计数器
}
否则
{
UCB1CTL1 || UCTXSTP; // I2C停止条件
UCB1IFG &=~UCTXIFG; //清除USI_B0 TX int标志
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0
}
中断;
默认值:中断;
}
}
在主要功能中,我正在传输 :
I2C_Transmit (0xD0); // RTC写模式地址
I2C_Transmit (0x00); // RTC第二个位置地址
I2C_Transmit (0x01); //要设置的RTC数据
I2C_Transmit (0xD0); // RTC写模式地址
I2C_Transmit (0x00); // RTC第二个位置地址
I2C_Transmit (0xD1); // RTC读取模式地址
I2C_receive();



