Zoiphy 发表于 2013-8-4 15:31:13

【求助】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;
}


这个硬件配置起来真的很头大啊。。。。

Zoiphy 发表于 2013-8-4 15:32:03

自己顶~~~

lcofjp 发表于 2013-8-4 16:14:07

看着程序确实不像有问题

wozai2513 发表于 2013-8-4 16:26:25

示波器抓波形

xukai871105 发表于 2013-8-4 20:32:23

UCB3I2CSA = SlaveAddress;

是不是地址错了,我看了一下数据手册,地址可以为0x1D 或者 0x53

xukai871105 发表于 2013-8-4 20:54:16

随机读可能也有问题:

while((UCB3IFG&UCRXIFG)==0);            // 等待接受一个数据
RandomReadByte = UCB3RXBUF;               // 读入一个数据
UCB3CTL1 |= UCTXSTP+ UCTXNACK;            // 启动停止信号,发应答信号

我觉得应该是先操作UCB3CTL1
UCB3CTL1 |= UCTXSTP+ UCTXNACK;            // 启动停止信号,发应答信号
while((UCB3IFG&UCRXIFG)==0);            // 等待接受一个数据
RandomReadByte = UCB3RXBUF;               // 读入一个数据

身边没有代码,具体我可以试试

Zoiphy 发表于 2013-8-5 10:01:31

xukai871105 发表于 2013-8-4 20:32 static/image/common/back.gif
UCB3I2CSA = SlaveAddress;

是不是地址错了,我看了一下数据手册,地址可以为0x1D 或者 0x53 ...

这个地址我写的 0xA6
ADDR拉低了~

Zoiphy 发表于 2013-8-5 10:02:50

xukai871105 发表于 2013-8-4 20:54 static/image/common/back.gif
随机读可能也有问题:

while((UCB3IFG&UCRXIFG)==0);            // 等待接受一个数据


现在写不进去~可能还是我设的有问题~ 我同学用软件模拟也没有读到数据~

xukai871105 发表于 2013-8-5 11:03:57

Zoiphy 发表于 2013-8-5 10:01 static/image/common/back.gif
这个地址我写的 0xA6
ADDR拉低了~

你不能写A6 操作I2CSA时需要写入的是7位地址,而不是什么读操作地址和写操作地址,这个和I2C软件操作是不一样的。

还有,MSP430写I2C停止的时候,在读操作时也和软件模拟的不一样,你可以多尝试一下!

飘香雪剑 发表于 2013-8-24 23:33:15

为什么要写入0X35而不是0XA6

xukai871105 发表于 2013-8-25 10:31:33

飘香雪剑 发表于 2013-8-24 23:33 static/image/common/back.gif
为什么要写入0X35而不是0XA6

我确定是写0x53 而不是0xA6

一般情况下 I2C从机地址定义为 AAAA AAAX 这种写法便是0xA6
但是MSP430的 I2C从机地址定义为 XAAA AAAA这种写法便是0x53

如果还不清楚,我上传代码吧,你修改一下测试一下就明白了!

syauxwm 发表于 2013-8-25 22:19:59

为什么不用SIP口呢,还有一个问题就是,ADXL345测量的频率范围的应用问题,如果是实验也需要注意这个问题,因为我就遇到这个问题,实际信号超过频响,测试不准,呵呵{:smile:}

飘香雪剑 发表于 2013-8-26 19:05:33

谢了,经过我的试验,确实是0x53,而且从机的地址是430自己发送的,谢谢大神了

a364669932 发表于 2014-1-9 17:21:47

不错。这个必须顶一顶。
页: [1]
查看完整版本: 【求助】MSP430F5438A + ADXL345 硬件IIC的问题