工具/软件:Code Composer Studio
您好,
我正在对i4721进行编程,而不是i2c。 将命令写入si4721时没有错误。 但是当我想阅读si4721的回应时,我从未经历过这样的事情。 下面是读取和写入代码部分。
void i2c_tX_init (void){
__disable_interrupt ();
i2c_comm_type ='T'; // i2c传输模式
IE2 &=~UCB0RXIE;
while (UCB0CTL1和UCTXSTP); //确保停止条件已发送//禁用RX中断
UCB0CTL1 || UCSWRST; //启用软件重置
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = i2c_address; //从属地址
UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
IE2 |= UCB0TXIE; //
启用TX中断,同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
UCB0CTL1 || UCTR + UCTXSTT; // I2C tx,启动条件
}
void i2c_rx_init (void){__disable_interrupt()
;
i2c_comm_type ='R'; // i2c接收模式
IE2 &=~UCB0TXIE;
UCB0CTL1 |= UCSWRST; //启用软件重置
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = i2c_address; //从属地址
UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
IE2 |= UCB0RXIE; //
启用RX中断,同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
UCB0CTL1 || UCTXSTT; // I2C启动条件
}
void write_si4721(void){ //将寄存器写入si4721并读取
i2c_init();
__bis_sr_register (CPUOFF + GIE);
__delay_cycles(200);// 等待缓冲区清空
i2c_rx_init();
__bis_sr_register(CPUOFF + GIE);
}
#pragma vector = USCIAB0TX_vector
__interrupt void USCIAB0TX_ISR(void){
IF(i2c_comm_type =='T'){ // i2c传输模式
if (transmit_arg_number){
Transmit_arg_number--;
IFG2 &=~UCB0TXIFG; // clear USI_B0 tx int flag
UCB0TXBUF = si4721_write_packet[transmit_arg_number];
}
else {
UCB0CTL1 |= UCTXSTP; // I2C停止条件
IFG2 &=~UCB0TXIFG; // Clear USI_B0 TX int flag
__BIC_SR_REGISTER_ON_EXIT (CPUOFF + GIE); //如果数据为
}则退出LPM0
,否则为(i2c_comm_type =='R'){ // i2c接收模式
__delay_cycles(500);
if (response_packet_number){ //检查RX字节计数
器si4721_read_packet[si4721_read_packet_lenth -4721 - Response_packet_number]= UCB0RXBUF;
//获取RX数据
Response_packet_number--
;}
else{
UCB0CTL1 || UCTXSTP; //不重复启动:停止条件
IFG2 &=~UCB0RXIFG; // Clear USI_B0 TX int flag
__BIC_SR_REGISTER_ON_EXIT (CPUOFF + GIE); //如果数据为
}
,则退出LPM0 }}
如果我没有在“2c_rx_init();”行后设置断点,则i2c行上的信号为:
但如果我在“i2c_rx_init();”行后设置断点,则i2c行:
si4721的响应应该是0x80。 从si4721接收数据时出现什么问题? 我需要做什么? 到目前为止,我尝试了延迟,但没有得到正确的回应。
此致。