OpenEdv-开源电子网
标题:
求大神帮助,MSP430G2553的IIC程序,在线等
[打印本页]
作者:
两个人的烟火
时间:
2014-7-29 19:12
标题:
求大神帮助,MSP430G2553的IIC程序,在线等
调试时发现程序会停在 IIC_Wait_Ack() 的 while(READ_SDA)中,用示波器查看过是有波形的。求大神帮忙!!!感谢!!!
#include "msp430G2553.h"
#include "simulation_IIC.h"
#include "stdint.h"
void IIC_Init(void)
{
P1DIR |= BIT4 + BIT5;
P1OUT |= BIT4 + BIT5;
}
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA_1;
IIC_SCL_1;
delay_us(5);
IIC_SDA_0;//START:when CLK is high,DATA change form high to low
delay_us(5);
IIC_SCL_0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL_0;
IIC_SDA_0;//STOP:when CLK is high DATA change form low to high
delay_us(5);
IIC_SCL_1;
IIC_SDA_1;//发送I2C总线结束信号
delay_us(5);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
P1REN |= BIT4;
P1OUT |= BIT4; //上拉输入
delay_us(5);
IIC_SCL_1;
delay_us(5);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL_0;//时钟输出0
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL_0;
SDA_OUT();
IIC_SDA_0;
delay_us(5);
IIC_SCL_1;
delay_us(5);
IIC_SCL_0;
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL_0;
SDA_OUT();
IIC_SDA_1;
delay_us(5);
IIC_SCL_1;
delay_us(5);
IIC_SCL_0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL_0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
//IIC_SDA=(txd&0x80)>>7;
if((txd&0x80)>>7)
IIC_SDA_1;
else
IIC_SDA_0;
txd<<=1;
delay_us(5); //对TEA5767这三个延时都是必须的
IIC_SCL_1;
delay_us(5);
IIC_SCL_0;
delay_us(5);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL_0;
delay_us(5);
IIC_SCL_1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(5);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
作者:
w0rmis20
时间:
2014-7-29 19:12
回复【16楼】两个人的烟火:
---------------------------------
嗯,弄两个4.7k的就可以了
作者:
正点原子
时间:
2014-7-29 20:11
READ_SDA信号强制拉低,还死机么?
作者:
两个人的烟火
时间:
2014-7-29 20:19
回复【2楼】正点原子:
---------------------------------
强制拉低就不死机了
作者:
两个人的烟火
时间:
2014-7-29 20:21
回复【2楼】正点原子:
---------------------------------
原子哥 这就是从你的32程序上移植过来的
作者:
Limcy
时间:
2014-7-29 20:36
你的ucErrTime有清0吗?
作者:
Limcy
时间:
2014-7-29 20:38
你的程序应该不会停在IIC_Wait_Ack()啊,不是ucErrTime>250就return了?
作者:
正点原子
时间:
2014-7-29 20:38
回复【4楼】两个人的烟火:
---------------------------------
我们的例程好使的。
作者:
两个人的烟火
时间:
2014-7-29 20:44
回复【7楼】正点原子:
---------------------------------
在32上试过了没问题,可不知道为什么搬到430上就不行,各种延时都试过了,
作者:
两个人的烟火
时间:
2014-7-29 20:45
回复【6楼】Limcy:
---------------------------------
最后return 1了,就是接受应答失败了
作者:
Limcy
时间:
2014-7-29 20:49
IIC的,输入和输出好像都要上拉。
作者:
两个人的烟火
时间:
2014-7-29 20:57
回复【10楼】Limcy:
---------------------------------
不是这个问题额
作者:
八度空间
时间:
2014-7-30 08:17
将发送一个字节函数去掉最后一个5us延时,再测试一下看下行不行
作者:
两个人的烟火
时间:
2014-8-1 10:21
回复【12楼】Badu_Space:
---------------------------------
按照你说的,还是不行的样子,
作者:
两个人的烟火
时间:
2014-8-1 10:22
回复【12楼】Badu_Space:
---------------------------------
我的430主频设置为了1Mhz,跟32比起来差太多了
作者:
w0rmis20
时间:
2014-8-1 10:30
你的有没有加上拉电阻?我记得430是需要加的
作者:
两个人的烟火
时间:
2014-8-1 10:43
回复【15楼】w0rmis20:
---------------------------------
你是说SCL和SDA先接个上拉电阻上拉到5V,再接到IO口吗?
作者:
两个人的烟火
时间:
2014-8-1 10:45
回复【17楼】w0rmis20:
---------------------------------
我本来就是这么连的,之前玩32也是这么连的
作者:
w0rmis20
时间:
2014-8-1 10:48
回复【18楼】两个人的烟火:
---------------------------------
那就不知道了,以前只用过F149的。。如果是自己焊接的板子注意有没有焊实,我就吃过这亏
作者:
两个人的烟火
时间:
2014-8-1 10:55
回复【19楼】w0rmis20:
---------------------------------
我用的是Lauchpad ,调这个模拟IIC调了n天了,还是不行,诶
作者:
八度空间
时间:
2014-8-1 11:26
回复【14楼】两个人的烟火:
---------------------------------
试移植这里3楼附件的试下,这个在51和32上面都已经调试通过了的
http://www.openedv.com/posts/list/32492.htm
作者:
两个人的烟火
时间:
2014-8-1 16:23
回复【21楼】Badu_Space:
---------------------------------
试了下,还是同样的问题,我跟AT24X64通信,问题都是出在了同样的位置,最后一个IIC_Wait_Ack()那里。
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值:读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}
作者:
八度空间
时间:
2014-8-1 17:08
回复【22楼】两个人的烟火:
---------------------------------
老规矩,抓IIC波形分析
作者:
两个人的烟火
时间:
2014-8-1 18:33
回复【23楼】Badu_Space:
---------------------------------
能否具体点?单步调试下来是没问题的
作者:
八度空间
时间:
2014-8-1 19:24
回复【24楼】两个人的烟火:
---------------------------------
全速有问题是吧?将频率降低一点试下
作者:
两个人的烟火
时间:
2014-8-2 11:19
回复【25楼】Badu_Space:
---------------------------------
找到问题所在了,我用IIC_Start函数,拉低SDA时,IO输出是低电平,但芯片的SDA口依然是高电平,所以后来的应答位都收不到了,这时候SDA接地是可以强制拉低的。换了IO口,依然出现这个问题,大哥有什么想法么?
作者:
两个人的烟火
时间:
2014-8-2 11:22
回复【25楼】Badu_Space:
---------------------------------
但也不是每个IIC_Start函数都这样,AT24CXX_ReadOneByte(u16 ReadAddr)的最后一个Start函数开始会出现这种问题,
作者:
八度空间
时间:
2014-8-2 12:22
回复【27楼】两个人的烟火:
---------------------------------
延时一下再操作呢
作者:
八度空间
时间:
2014-8-2 12:26
你这个估计是在2402芯片操作里面的问题,原子哥老版本的有bug
http://www.openedv.com/posts/list/35740.htm这里有一个2402的驱动,或者你问原子哥要最新版本的试下
作者:
两个人的烟火
时间:
2014-8-2 14:27
回复【7楼】正点原子:
---------------------------------
原子哥,有最新的24CXX程序吗?可否分享下
作者:
两个人的烟火
时间:
2014-8-2 15:58
回复【25楼】Badu_Space:
---------------------------------
能私聊下么
作者:
八度空间
时间:
2014-8-2 20:04
回复【31楼】两个人的烟火:
---------------------------------718702622
作者:
正点原子
时间:
2014-8-2 22:53
回复【30楼】 两个人的烟火 :
---------------------------------
http://www.openedv.com/posts/list/13912.htm?fromAll=0
欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/)
Powered by Discuz! X3.4