完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
调试时发现程序会停在 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; } |
|
相关推荐
32个回答
|
|
试移植这里3楼附件的试下,这个在51和32上面都已经调试通过了的http://www.openedv.com/posts/list/32492.htm
|
|
|
|
试了下,还是同样的问题,我跟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; } |
|
|
|
老规矩,抓IIC波形分析
|
|
|
|
能否具体点?单步调试下来是没问题的
|
|
|
|
全速有问题是吧?将频率降低一点试下
|
|
|
|
找到问题所在了,我用IIC_Start函数,拉低SDA时,IO输出是低电平,但芯片的SDA口依然是高电平,所以后来的应答位都收不到了,这时候SDA接地是可以强制拉低的。换了IO口,依然出现这个问题,大哥有什么想法么?
|
|
|
|
但也不是每个IIC_Start函数都这样,AT24CXX_ReadOneByte(u16 ReadAddr)的最后一个Start函数开始会出现这种问题,
|
|
|
|
延时一下再操作呢
|
|
|
|
你这个估计是在2402芯片操作里面的问题,原子哥老版本的有bug
http://www.openedv.com/posts/list/35740.htm这里有一个2402的驱动,或者你问原子哥要最新版本的试下 |
|
|
|
原子哥,有最新的24CXX程序吗?可否分享下
|
|
|
|
能私聊下么
|
|
|
|
718702622
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3052个成员聚集在这个小组
加入小组2963 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3674 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2360 浏览 1 评论
4824 浏览 1 评论
2585 浏览 1 评论
1362浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3677浏览 2评论
2964浏览 1评论
1556浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 03:36 , Processed in 1.358083 second(s), Total 72, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号