本帖最后由 trouvan 于 2016-7-28 01:09 编辑
芯片是G2553 参考官方的代码,初始化P1.7为SDA 1.6为SCL
这是
发送的代码。单步调试发现,进入过一次USCIAB0TX_ISR的中断,但之后就再也进不去了,一直停在最后那个while循环中。
- void HardI2C_Write(byte slaveAddress,byte address,byte data){
- UCB0I2CSA=slaveAddress;
- UCB0CTL1|=UCTR; //设置为发送模式
- sendData[1]=address;
- sendData[0]=data;
- dataSendCnt=2;
- UCB0CTL1|=UCTXSTT;//产生开始信号
- __bis_SR_register(CPUOFF + GIE);
- while (UCB0CTL1 & UCTXSTP);
- }
复制代码按参考手册所说:
一旦数据由缓冲区转移到移位寄存器,UCBxTXIFG 将再次置位。
但我看了一下寄存器,缓冲区UCB0TXBUF一直都是有值得,也就是它原来的值一直没发出去,所以无法进入下一次中断。
困扰了一晚上,还是没解决。请大家帮忙。
(要通信的器件是MPU6050,430为主机,6050为从机。)
以下是
中断代码:
- // USCI_B0 Data ISR
- #pragma vector = USCIAB0TX_VECTOR
- __interrupt void USCIAB0TX_ISR(void)
- {
- if(IFG2&UCB0TXIFG){ //当是发送中断时
- if(dataSendCnt){//有数据待发送
- UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
- }else{
- UCB0CTL1|=UCTXSTP;//产生停止信号
- }
- }else if(IFG2&UCB0RXIFG){
- --dataReceCnt;
- if(!dataReceCnt){
- UCB0CTL1|=UCTXSTP;//产生停止信号
- }
- receData[dataReceCnt]=UCB0RXBUF;
- }
- }
复制代码
以下为
初始化代码:
- void HardI2C_Init(){
- P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- UCB0CTL1 |= UCSWRST;
- UCB0CTL0=UCMST+UCMODE_3+UCSYNC; //主控模式 i2c模式 同步模式
- UCB0CTL1=UCSSEL_2+ UCSWRST; //设置时钟为SMCLK
- UCB0BR0 = 12; // 分频 = SMCLK/12 = ~100kHz
- UCB0BR1 = 0;
- UCB0CTL1 &= ~UCSWRST;
- IE2 |= UCB0TXIE; //发送中断使能
- IE2 |= UCB0RXIE; //接收中断使能
-
- }
复制代码
参考这个帖子http://www.deyisupport.com/quest ... 0/f/55/t/52062.aspx
拿逻辑分析仪试了一下,只要用我的代码,SDA和SCL两条线是死活不动……
SDA一直是低电平,SCL一直是高电平。
拿官方的代码试了一下,好歹能看出有I2C开始信号、传送地址等变化
我的代码就是把官方的按照自己的需求模块化一下,把他写在main里的东西放在不同的文件里,
可是居然信号居然连变化也没变化
难道是寄存器配置问题?就那几个寄存器翻来覆去配置了一下午也没见什么改变
一周热门 更多>