工具与软件:
我正在尝试实现与从 IC 的 I2C 通信。 从器件为 ACS37800电源监控 IC。 目标
使用上述格式执行 I2C 读取操作。
该用例需要重复启动条件、我只能找到传统 I2C 从器件读取的示例代码(即没有重复启动)。
能否为 MSP430F2619提供用于实现重复启动的示例代码。
这是我尝试实现的[ SCL @ 143KHz]
#include
//定义全局变量
unsigned char RXData、Master_RX、TXByteCtr = 0、RXByteCtr = 4;// RXByteCtr 设置为要读取的字节数
int i、c=0;
unsigned char RXDataarr[15]={1、2、3、4、5、6、7、8、9、10、11、12、13、14、15};
//函数原型
void Master_TX_TO_RX_Slave (void);
空 MasterUSCIB0TX (空);
int main (void)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
P3SEL |= 0x06;//将 I2C 引脚分配至 USCI_B0
while (1)
{
Master_TX_to_RX_Slave ();//执行主器件 TX 到 RX 从器件通信
___ BIC_SR_register (GIE);
//清除通用中断使能
}
}
// USCI_B0 Data ISR1
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR (void)
#elif defined (_GNUC__)
void __attribute__(((interrupt (USCIAB0TX_vector))) USCIAB0TX_ISR (void)
#else
错误编译器不受支持!
#endif
{
如果(Master_RX = 0)
{
if (TXByteCtr =1)
{__delay_cycles (50);
UCB0TXBUF = 0x20;//发送寄存器地址
TXByteCtr --;
}
设计
{
MASTER_RX = 1;
//c=1;
UCB0CTL1 &=~μ s UCTR;//切换到 RX 模式
UCB0CTL1 |= UCTXSTT;//发送重复启动条件
}//do
//{
}
如果(Master_RX =1)
{
if (UCB0CTL1 & UCTXSTT)//确保发送启动条件
返回;
RXDataarr[c]= UCB0RXBUF;
C++;
if (c==8)
{
UCB0CTL1 |= UCTXSTP;//发送停止条件
IE2 &=~UCB0TXIE;
IE2&=~UCB0RXIE;
C=0;
}
}
}//ISR
//此函数用于启动主器件 TX 到 RX 从器件的通信
void Master_TX_TO_RX_Slave (void)
{
MasterUSCIB0TX ();
__bis_SR_register (GIE);//启用常规中断
TXByteCtr = 1;//加载 TX 字节计数器
while (UCB0CTL1 & UCTXSTP);//确保发送了停止条件
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
//添加超时机制以防止无限循环
while (UCB0CTL1和 UCTXSTT);
__bis_SR_register (GIE);//启用中断
while (UCB0CTL1 & UCTXSTP);//确保发送了停止条件
}
//配置 USCI_B0以进行主传输的函数
空 MasterUSCIB0TX (空)
{
UCB0CTL1 |= UCSWRST;//启用软件复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
UCB0BR0 = 7;//设置 SCL 频率1MHz/7 ~~ 143Khz
UCB0BR1=0;
UCB0I2CSA = 0x7F;//设置从器件地址(根据需要进行调整)
UCB0CTL1 &=~μ s UCSWRST;//清除软件复位、恢复操作
MASTER_RX = 0;//初始化 Master_RX 标志
IE2 |= UCB0TXIE + UCB0RXIE;//启用 TX 和 RX 中断
}
上述代码通过 ISR 迭代9次、以接收4个字节的从器件数据。 传输部分更易于理解、但我不明白接收部分的原因
需要迭代9次才能接收4个字节的从器件数据。 当它应该理论上只迭代4次。 我通过反复试验得到该值9、仅进行了4次迭代
产生少于4个字节的结果、并以 I2C 通信的过早终止结束。
即使接收到4个字节、RXIFG 标志仍然保持置位、这也是需要关注的领域、因为我预计会在4个字节后终止通信。
对于此问题发生的原因、任何类型的解决方案或建议都将非常有帮助。
此致、
Anand 与