完善资料让更多小伙伴认识你,还能领取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个回答
|
|
嗯,弄两个4.7k的就可以了
|
|
|
|
READ_SDA信号强制拉低,还死机么?
|
|
|
|
强制拉低就不死机了
|
|
|
|
原子哥 这就是从你的32程序上移植过来的
|
|
|
|
你的ucErrTime有清0吗?
|
|
|
|
你的程序应该不会停在IIC_Wait_Ack()啊,不是ucErrTime>250就return了?
|
|
|
|
我们的例程好使的。
|
|
|
|
在32上试过了没问题,可不知道为什么搬到430上就不行,各种延时都试过了,
|
|
|
|
最后return 1了,就是接受应答失败了
|
|
|
|
IIC的,输入和输出好像都要上拉。
|
|
|
|
不是这个问题额
|
|
|
|
将发送一个字节函数去掉最后一个5us延时,再测试一下看下行不行
|
|
|
|
按照你说的,还是不行的样子,
|
|
|
|
我的430主频设置为了1Mhz,跟32比起来差太多了
|
|
|
|
你的有没有加上拉电阻?我记得430是需要加的
|
|
|
|
你是说SCL和SDA先接个上拉电阻上拉到5V,再接到IO口吗?
|
|
|
|
我本来就是这么连的,之前玩32也是这么连的
|
|
|
|
那就不知道了,以前只用过F149的。。如果是自己焊接的板子注意有没有焊实,我就吃过这亏
|
|
|
|
我用的是Lauchpad ,调这个模拟IIC调了n天了,还是不行,诶
|
|
|
|
只有小组成员才能发言,加入小组>>
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-20 22:46 , Processed in 1.432567 second(s), Total 85, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号