主题中讨论的其他部件: TLV320ADC3101
工具/软件:Code Composer Studio
大家好
客户评估MSP 430F5242和TLV320DAC32之间的I2C通信。
为了检查其是否正确写入了登记簿,在写入后将读取相同地址的登记簿。
但是,似乎正在读取指定地址+1的寄存器内容。
下图显示了将0x55写入寄存器地址0x03,然后读取寄存器地址0x03,0x02时的波形。
因此,当读取寄存器地址0x02时,将输出0x55。
比较数据表P22的图24 (I2C写入)和图25 (I2C读取)似乎没有问题。
您是否知道书写或阅读是否有问题?
下面是MSP 430源代码。
reg = 0x03,num = 1
uchar I2C_READ (uchar reg,uchar num,uchar *buf)
{
uchar tx_buf[10];
tx_buf[0]=reg;
PTxData =(uchar *)&TX_buf[0]; /* Tx缓冲区指针集*/
UCB1CTL1 |= UCSWRST; /*启用软件重置*/
UCB1CTL0 = UCMST + UCMODE_3 + UCWYNC; /* I2C主控,同步模式*/
UCB1CTL1 = UCSSEL_2 + UCSSWRST; /*使用SMCLK,保持软件重置*/
UCB1BR0 = 80; /* fSCL (8MHz)= SMCLK/80 = 100kHz (SMCLK/20 = 400kHz)*/
UCB1BR1 = 0;
UCB1I2CSA = I2C_ADR; /*从属地址*/
UCB1CTL1 &=~UCSWRST; /*清除软件重置,恢复操作*/
UCB1IE |= UCTXIE; /*启用TX中断*/
UCB1IE |= UCRXIE; /*启用RX中断*/
TM1M_CNT = 200; /*超时*/
FI2C_IRQ =关闭; /*中断*/
PRxData =(uchar *) buf; /* Rx缓冲区指针集*/
RXByteCtr = 0;
TXByteCtr = 1;
同时(UCB1CTL1和UCTXSTP); //确保停止条件已发送
UCB1CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件
同时(1)
{
如果(FI2C_IRQ == ON)中断;
如果(TM1M_CNT ==0)转到TM_ERR;
}
FI2C_IRQ =关闭; /*中断*/
//接收过程
RXByteCtr = 1;
同时(UCB1CTL1和UCTXSTP); //确保停止条件已发送
UCB1CTL1 &=~UCTR; //清除UCTR
UCB1CTL1 || UCTXSTT; // I2C启动条件
期间(UCB1CTL1和UCTXSTT); //开始条件已发送?
UCB1CTL1 || UCTXSTP; // I2C停止条件
同时(1)
{
如果(FI2C_IRQ == ON)中断;
如果(TM1M_CNT ==0)转到TM_ERR;
}
返回正常;
tm_err:
SetResponse (((uchar *)"TM err");
返回错误;/*错误*/
}
#pragma vector = USI_B1_Vector
__interrupt void USI_B1_ISR(void)
{
SWITCH(__EIV_IN_RANGE(UCB1IV,12))
{
案例0:中断; /*矢量0:无中断*/
案例2:中断; /*矢量2:ALIFG */
案例4:中断; /*矢量4:NACKIFG */
案例6:中断; /*向量6:STTIFG */
案例8:中断; /*矢量8:STPIFG */
案例10: /*矢量10:RXIFG */
案例12: /*矢量12:TXIFG */
IF (RXByteCtr == 1)
{//主中继器接收?
*PRxData = UCB1RXBUF; //获取RX数据
FI2C_IRQ =打开; /*中断*/
}
否则
{//主传输
IF (TXByteCtr) //检查TX字节计数器
{
UCB1TXBUF =* PTxData; //加载TX缓冲区
TXByteCtr // Decrement TX字节计数器
}
否则
{
UCB1CTL1 || UCTXSTP; // I2C停止条件
UCB1IFG &=~UCTXIFG; //清除USI_B0 TX int标志
FI2C_IRQ =打开; /*中断*/
}
}
中断;
默认:中断;
}
}
它能够使用与连接到相同I2C总线的TLV320ADC3101相同的功能正常读写...
请进行注释,以便它可以与TLV320DAC32正常通信。
此致,
Takashi