STM32
直播中

彭逸晨

7年用户 162经验值
私信 关注
[问答]

我根据iic总线时序图编写的程序老是出问题的解决办法?

原子哥,现象:我在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 )

回帖(6)

李渔滢

2020-5-27 15:13:36
用我们的代码,在我们的开发板上测试的?
 
举报

张媛媛

2020-5-27 15:32:37
不是的。你们的代码我看过了。这是我自己编的,但是测试不通过。我想看看我对iic总线的时序理解到对不对。帮忙看一下吧,原子哥。
举报

冯金妮

2020-5-27 15:46:32
这个还是你自己慢慢对照吧.参考我们的例子.
举报

李秋年

2020-5-27 15:54:57
……………………………………………………………………………………
举报

更多回帖

发帖
×
20
完善资料,
赚取积分