OpenEdv-开源电子网

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

我根据iic总线时序图编写的程序,但是老是出问题。我是在找不见是什么问题。

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-21
在线时间
3 小时
发表于 2012-5-21 16:09:21 | 显示全部楼层 |阅读模式

原子哥,现象:我在eeprom某个地址写个数,然后在读出来显示,但是返回的数据老是不对 。帮忙看一下到底是除了什么问题。谢谢!!

#include "iic.h"
#include "delay.h"

//iic初始化
void iicinit(void)
{
  RCC->APB2ENR|=1<<4;//开启portc的时钟
  GPIOC->CRH&=0XFFF00FFF;
  GPIOC->CRH|=0X00033000;  //设置c 11 12为推挽输出
  GPIOC->ODR|=3<<11;     //PC11,12 输出高

}
//iic起始信号
void  iicstart(void)
{
 //sda线输出
 sda_out();    
 iic_sda=1;
 delay_us(7);     
 iic_scl=1;
 delay_us(7);
  iic_sda=0;//START:when CLK is high,DATA change form high to low
 delay_us(7);
 iic_scl=0;//钳住I2C总线,准备发送或接收数据
}
//iic终止信号
void iicstop(void)
{
 //sda线输出
 sda_out();
 iic_sda=0;
 delay_us(7);
 iic_scl=1; //STOP:when CLK is high DATA change form low to high
  delay_us(7);
 iic_sda=1;//发送I2C总线结束信号
 delay_us(4);
// iic_scl=0 ;
}
//应答信号ack=1,应答,ack=1,不应答
u8 iic_ack(void)
{
 u8 ack ;
 sda_in(); 
 //read_sda=1; 
 //delay_us(5);
 iic_scl=1;
 delay_us(7);
 ack =read_sda;
 delay_us(5);
 iic_scl=0;
 delay_us(5);
 return (ack);
}
//通过icc总线写1位数据
void iic_write_onebit(u8 data)
{  
   sda_out();
   iic_sda=data;
   delay_us(10);
   iic_scl=1;
   delay_us(10);
   iic_scl=0;
   delay_us(10);
}
//写一个字节
void iic_write_onebyte(u8 data) //写数据时,从高位往低位写,先写第8位
{   
 u8 t;
 u8 temp;
 sda_out();
 temp=data;
  for(t=8;t>0;t--)
 {
  if(temp&0x80)
   iic_write_onebit(1);
  else
   iic_write_onebit(0);
  temp<<=1;
 } 
}
//读一个字节
u8 iic_read_onebyte(void)
{
 u8 t,flag=0;
 u8 data=0;
 sda_in();
 iic_scl=0;
 delay_us(10);
 iic_scl=1;
 delay_us(5);
 for(t=0;t<8;t++)
  {
   flag=read_sda;
   data<<=1; //8位数据传完后,要scl清零
   if(flag)
    data|= 0x01;
   
  }
 iic_scl=0;
   delay_us(10);
 return (data); 
}
//向24c02某个地址写数据
void write_24c02_onebyte(u16 add ,u8 data)
{
 iicstart();
 iic_write_onebyte(0xa0);
 iic_ack();
 iic_write_onebyte(add);
 iic_ack();
 iic_write_onebyte(data);
 iic_ack();
 iicstop();
 delay_ms(5);
}
//从24c02里读数据
u8 read_24c02_onebyte(u16 add)
{
 u8 data;
 iicstart();
 iic_write_onebyte(0xa0); //开始写
 iic_ack();
 iic_write_onebyte(add);
 iic_ack();

 iicstart();
 iic_write_onebyte(0xa1);//开始读
 iic_ack();
 data=iic_read_onebyte();
 iic_ack();
 iicstop();

 return (data);


}

ALIENTEK MINISTM32 实验16 IIC实验.zip

1.77 MB, 下载次数: 743

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-21 18:16:55 | 显示全部楼层
用我们的代码,在我们的开发板上测试的?
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-21
在线时间
3 小时
 楼主| 发表于 2012-5-21 18:59:39 | 显示全部楼层
回复【2楼】正点原子:
用我们的代码,在我们的开发板上测试的?  
---------------------------------
不是的。你们的代码我看过了。这是我自己编的,但是测试不通过。我想看看我对iic总线的时序理解到对不对。帮忙看一下吧,原子哥。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-21 20:59:36 | 显示全部楼层
回复【3楼】wfeng231:
---------------------------------
这个还是你自己慢慢对照吧.参考我们的例子.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-21
在线时间
3 小时
 楼主| 发表于 2012-5-22 14:09:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
……………………………………………………………………………………
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-5-10
在线时间
0 小时
发表于 2012-5-22 15:08:55 | 显示全部楼层
回复【楼主位】wfeng231:
---------------------------------
你能确定你写的正确了?
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-21
在线时间
3 小时
 楼主| 发表于 2012-5-24 16:52:16 | 显示全部楼层
回复【6楼】lutianqian:
---------------------------------
按时序来讲的话,程序没错。经过反复实验,偶找见原因了,是这个u8 read_24c02_onebyte(u16 add)函数里面的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 01:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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