【求助】MSP430F5438A + ADXL345 硬件IIC的问题
小弟正在学MSP430用MSP430F5438A 硬件IIC 调ADXL345 配置都是按着历程来的,但是运行时总是停在
UCB3TXBUF = Address;
while((UCB3IFG & UCTXIFG)==0);
好像是接收不到ADXL345的ACK回应。。。不太懂是哪里出的错。。
上代码,求大神们指点一下~~~
void iic_init(void)
{
P10SEL |= 0x06;
UCB3CTL1 |= UCSWRST;
UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC;
UCB3CTL1 = UCSSEL_2 + UCSWRST;
UCB3BR0 = 10;//
UCB3I2CSA = SlaveAddress; // 从机地址,7位寻址方式(1001000) 从地址寄存器
UCB3CTL1 &= ~UCSWRST; // 清除状态机复位,恢复工作.
}
/******************************************************************************
写单字节
******************************************************************************/
void WriteByte (unsigned char Address,unsigned char Byte)
{
while(UCB3CTL1 & UCTXSTP); // 确保停止位已发出,总线空闲
UCB3CTL1 |= UCTXSTT + UCTR; // 启动开始信号+写模式
UCB3TXBUF = Address; // 写入地址
while((UCB3IFG & UCTXIFG)==0); //配置寄存器时,就会停在这里
UCB3TXBUF = Byte ; // 写入单数据
while((UCB3IFG & UCTXIFG)==0);
UCB3CTL1 |= UCTXSTP; // 启动停止信号
while((UCB3CTL1 & UCTXSTP)==1); // 等待停止信号是否已发送完成
}
/******************************************************************************
读单字节
******************************************************************************/
unsigned char RandomRead (unsigned char Address)
{
while (UCB3CTL1 & UCTXSTP); // 确保停止位已发出,总线空闲
UCB3CTL1 |= UCTXSTT + UCTR; // 启动开始信号+写模式
UCB3TXBUF = Address; // 写入地址
while((UCB3IFG & UCTXIFG)==0);
UCB3CTL1 &= ~UCTR; // 改为读模式
UCB3CTL1 |= UCTXSTT; // 重新启动开始信号
while((UCB3CTL1 & UCTXSTT)==1); // 确保发出
delay_ms(1); // 增加一个适当延时
while((UCB3IFG&UCRXIFG)==0); // 等待接受一个数据
RandomReadByte = UCB3RXBUF; // 读入一个数据
UCB3CTL1 |= UCTXSTP+ UCTXNACK; // 启动停止信号,发应答信号
return RandomReadByte;
}
这个硬件配置起来真的很头大啊。。。。
自己顶~~~ 看着程序确实不像有问题 示波器抓波形 UCB3I2CSA = SlaveAddress;
是不是地址错了,我看了一下数据手册,地址可以为0x1D 或者 0x53 随机读可能也有问题:
while((UCB3IFG&UCRXIFG)==0); // 等待接受一个数据
RandomReadByte = UCB3RXBUF; // 读入一个数据
UCB3CTL1 |= UCTXSTP+ UCTXNACK; // 启动停止信号,发应答信号
我觉得应该是先操作UCB3CTL1
UCB3CTL1 |= UCTXSTP+ UCTXNACK; // 启动停止信号,发应答信号
while((UCB3IFG&UCRXIFG)==0); // 等待接受一个数据
RandomReadByte = UCB3RXBUF; // 读入一个数据
身边没有代码,具体我可以试试
xukai871105 发表于 2013-8-4 20:32 static/image/common/back.gif
UCB3I2CSA = SlaveAddress;
是不是地址错了,我看了一下数据手册,地址可以为0x1D 或者 0x53 ...
这个地址我写的 0xA6
ADDR拉低了~ xukai871105 发表于 2013-8-4 20:54 static/image/common/back.gif
随机读可能也有问题:
while((UCB3IFG&UCRXIFG)==0); // 等待接受一个数据
现在写不进去~可能还是我设的有问题~ 我同学用软件模拟也没有读到数据~ Zoiphy 发表于 2013-8-5 10:01 static/image/common/back.gif
这个地址我写的 0xA6
ADDR拉低了~
你不能写A6 操作I2CSA时需要写入的是7位地址,而不是什么读操作地址和写操作地址,这个和I2C软件操作是不一样的。
还有,MSP430写I2C停止的时候,在读操作时也和软件模拟的不一样,你可以多尝试一下! 为什么要写入0X35而不是0XA6 飘香雪剑 发表于 2013-8-24 23:33 static/image/common/back.gif
为什么要写入0X35而不是0XA6
我确定是写0x53 而不是0xA6
一般情况下 I2C从机地址定义为 AAAA AAAX 这种写法便是0xA6
但是MSP430的 I2C从机地址定义为 XAAA AAAA这种写法便是0x53
如果还不清楚,我上传代码吧,你修改一下测试一下就明白了! 为什么不用SIP口呢,还有一个问题就是,ADXL345测量的频率范围的应用问题,如果是实验也需要注意这个问题,因为我就遇到这个问题,实际信号超过频响,测试不准,呵呵{:smile:} 谢了,经过我的试验,确实是0x53,而且从机的地址是430自己发送的,谢谢大神了 不错。这个必须顶一顶。
页:
[1]