OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5880|回复: 32

求大神帮助,MSP430G2553的IIC程序,在线等

[复制链接]

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
发表于 2014-7-29 19:12:21 | 显示全部楼层 |阅读模式
5金钱
调试时发现程序会停在 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;
}






最佳答案

查看完整内容[请看2#楼]

回复【16楼】两个人的烟火: --------------------------------- 嗯,弄两个4.7k的就可以了
绝望的下一秒就是机遇和希望!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-7-29 19:12:22 | 显示全部楼层
回复【16楼】两个人的烟火:
---------------------------------
嗯,弄两个4.7k的就可以了
目前在玩STM32,BBB,RPi
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164883
金钱
164883
注册时间
2010-12-1
在线时间
2099 小时
发表于 2014-7-29 20:11:56 | 显示全部楼层
READ_SDA信号强制拉低,还死机么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-7-29 20:19:54 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
强制拉低就不死机了
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-7-29 20:21:56 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥 这就是从你的32程序上移植过来的
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-7-29 20:36:11 | 显示全部楼层
你的ucErrTime有清0吗?
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-7-29 20:38:10 | 显示全部楼层
你的程序应该不会停在IIC_Wait_Ack()啊,不是ucErrTime>250就return了?
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164883
金钱
164883
注册时间
2010-12-1
在线时间
2099 小时
发表于 2014-7-29 20:38:22 | 显示全部楼层
回复【4楼】两个人的烟火:
---------------------------------
我们的例程好使的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-7-29 20:44:51 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
在32上试过了没问题,可不知道为什么搬到430上就不行,各种延时都试过了,
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-7-29 20:45:43 | 显示全部楼层
回复【6楼】Limcy:
---------------------------------
最后return 1了,就是接受应答失败了
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-7-29 20:49:51 | 显示全部楼层
IIC的,输入和输出好像都要上拉。
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-7-29 20:57:32 | 显示全部楼层
回复【10楼】Limcy:
---------------------------------
不是这个问题额
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-30 08:17:14 | 显示全部楼层
将发送一个字节函数去掉最后一个5us延时,再测试一下看下行不行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 10:21:27 | 显示全部楼层
回复【12楼】Badu_Space:
---------------------------------
按照你说的,还是不行的样子,
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 10:22:20 | 显示全部楼层
回复【12楼】Badu_Space:
---------------------------------
我的430主频设置为了1Mhz,跟32比起来差太多了
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 10:30:14 | 显示全部楼层
你的有没有加上拉电阻?我记得430是需要加的
目前在玩STM32,BBB,RPi
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 10:43:06 | 显示全部楼层
回复【15楼】w0rmis20:
---------------------------------
你是说SCL和SDA先接个上拉电阻上拉到5V,再接到IO口吗?
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 10:45:50 | 显示全部楼层
回复【17楼】w0rmis20:
---------------------------------
我本来就是这么连的,之前玩32也是这么连的
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 10:48:59 | 显示全部楼层
回复【18楼】两个人的烟火:
---------------------------------
那就不知道了,以前只用过F149的。。如果是自己焊接的板子注意有没有焊实,我就吃过这亏
目前在玩STM32,BBB,RPi
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 10:55:08 | 显示全部楼层
回复【19楼】w0rmis20:
---------------------------------
我用的是Lauchpad ,调这个模拟IIC调了n天了,还是不行,诶
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-1 11:26:22 | 显示全部楼层
回复【14楼】两个人的烟火:
---------------------------------
试移植这里3楼附件的试下,这个在51和32上面都已经调试通过了的http://www.openedv.com/posts/list/32492.htm
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 16:23:27 | 显示全部楼层
回复【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;
}
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-1 17:08:55 | 显示全部楼层
回复【22楼】两个人的烟火:
---------------------------------
老规矩,抓IIC波形分析
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-1 18:33:06 | 显示全部楼层
回复【23楼】Badu_Space:
---------------------------------
能否具体点?单步调试下来是没问题的
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-1 19:24:24 | 显示全部楼层
回复【24楼】两个人的烟火:
---------------------------------
全速有问题是吧?将频率降低一点试下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-2 11:19:38 | 显示全部楼层
回复【25楼】Badu_Space:
---------------------------------
找到问题所在了,我用IIC_Start函数,拉低SDA时,IO输出是低电平,但芯片的SDA口依然是高电平,所以后来的应答位都收不到了,这时候SDA接地是可以强制拉低的。换了IO口,依然出现这个问题,大哥有什么想法么?
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-2 11:22:30 | 显示全部楼层
回复【25楼】Badu_Space:
---------------------------------
但也不是每个IIC_Start函数都这样,AT24CXX_ReadOneByte(u16 ReadAddr)的最后一个Start函数开始会出现这种问题,
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-2 12:22:35 | 显示全部楼层
回复【27楼】两个人的烟火:
---------------------------------
延时一下再操作呢
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-2 12:26:27 | 显示全部楼层
你这个估计是在2402芯片操作里面的问题,原子哥老版本的有bug

http://www.openedv.com/posts/list/35740.htm这里有一个2402的驱动,或者你问原子哥要最新版本的试下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-2 14:27:35 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,有最新的24CXX程序吗?可否分享下
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
 楼主| 发表于 2014-8-2 15:58:13 | 显示全部楼层
回复【25楼】Badu_Space:
---------------------------------
能私聊下么
绝望的下一秒就是机遇和希望!
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-2 20:04:08 | 显示全部楼层
回复【31楼】两个人的烟火:
---------------------------------718702622
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164883
金钱
164883
注册时间
2010-12-1
在线时间
2099 小时
发表于 2014-8-2 22:53:44 | 显示全部楼层
 回复【30楼】 两个人的烟火 :
---------------------------------
http://www.openedv.com/posts/list/13912.htm?fromAll=0
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-24 07:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表