IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> i2c驱动(只读取ACK,不作判断) -> 正文阅读

[嵌入式]i2c驱动(只读取ACK,不作判断)

1. 代码

#include "eeprom.h"
#define SCL_H GPIO_BOP(GPIOB) = GPIO_PIN_1
#define SCL_L GPIO_BC(GPIOB) = GPIO_PIN_1
#define SDA_H GPIO_BOP(GPIOB) = GPIO_PIN_2
#define SDA_L GPIO_BC(GPIOB) = GPIO_PIN_2
#define SDA_OUT   //根据实际芯片定义
#define SDA_IN    //根据实际芯片定义
#define GetSDA()  gpio_input_bit_get(GPIOB,GPIO_PIN_2)

#define twr_delay()   //根据实际芯片定义  15ms
#define delay()       delay_10us(1) 
#define WDTFeed()     //根据实际芯片定义

void delay_10us(uint32_t n)
{
  uint32_t t;
  
  while(n--)
  {
    t = 180;      //180: @72MHz  GD32F310  10.3us
    while(t--)
    {
    } 
  }  
}

//初始化
void I2C_Init(void)
{
  //初始化时钟、管脚
}

/********************************************
SCL在高电平期间,SDA在下降沿时开始起动。
(注意:SDA由高变低之前持续的时间需>4.7us)
********************************************/
void i2cStart(void)
{
	SDA_H;
	delay();
	SCL_H;
	delay();
	SDA_L;
	delay();
	SCL_L;
	delay();
}

/********************************************
SCL在高电平期间,SDA一个上升沿结束通信。
(注意:SDA由低变高之前持续的时间需>4.7us)
********************************************/
void i2cStop(void)
{
	SDA_L;
	delay();
	SCL_H;
	delay();
	SDA_H;
	delay(); 
}

//应答信号
//返回:>0失败,0成功
uint8_t i2cAck(void)
{
	uint8_t i;
	
	i = 0;  
  	SDA_H;              //拉高SDA
	SDA_IN;		          //把SDA数据线释放
	delay();	          //等待从机拉低SDA
	SCL_H;	
	delay();
	while(GetSDA() == 1)       
	{
		i ++;				
	    if(i > 30)
	    {
	      i2cStop();      //执行该语句前,SCL为高
	      return 1;       //ACK出错
	    }
	}
	SCL_L;
	delay();
	SDA_OUT;
  	SDA_L;
	delay();
  	return 0;           //成功
}

//非应答信号
void i2cNack(void)
{
	SDA_H;
	delay();
	SCL_H;
	delay();
	SCL_L;
	delay();
	SDA_L;
	delay();
}

//写一个字节到i2c总线
void write_byte(uint8_t date)
{
	uint8_t i;
	
	SCL_L;
	delay();
	for(i=0;i<8;i++) 
	{
		if(date&0x80)
		{
			SDA_H;
		}
		else
		{
			SDA_L;
		}
		delay();
		SCL_H;
		delay();
	    SCL_L;
	    delay();
		date <<= 1;
	}
  	i2cAck();		//对EEPEOM返回的ack只读取,不作判断
}

//从I2c读取一个字节
uint8_t read_byte(void)    
{
	uint8_t i,j,n;

	n = 0;
	SCL_L;
	delay();
	SDA_IN;
	for(i=0;i<8;i++)
	{
		SCL_H;
		delay();
		j = GetSDA();		
		n = (n<<1) | j; 
		SCL_L;	   
		delay();
	}
	SDA_OUT;
  	SDA_L;
	delay();
	return n;
}

void i2cMasterAck(void)
{
	SDA_L;
	delay();
	SCL_H;
	delay();
	SCL_L;
	delay();
	SDA_L;
	delay();   
}

//写多字节
void AT24C64_W(u8 *buf,uint16_t addr,uint16_t count)
{
  while(count--)
  {
    WDTFeed();

    i2cStart();
    write_byte( 0xa0 );
    write_byte( (uint8_t)(addr>> 8));
    write_byte( (uint8_t)(addr& 0xFF));
    write_byte( *buf);
    i2cStop();
    twr_delay();       /* waiting for write cycle to be completed */
    buf ++;
    addr ++;
  }
}


//读多字节
void AT24C64_R(uint8_t *buf,uint16_t addr,uint16_t count)
{
  while(count--)
  {
    WDTFeed();

    i2cStart();
    write_byte( 0xa0 );
    write_byte( (uint8_t)(addr>> 8));
    write_byte( (uint8_t)(addr& 0xFF));
    i2cStart();
    write_byte( 0xa1 );
    *buf = read_byte();
    i2cNack();
    i2cStop();
    buf ++;
    addr ++;
  }
}

//写入一个u16型数据
void AT24C64_W16(u16 data16,uint16_t addr)
{
  	u8 buf[2];
  
 	buf[0] = data16;			//低位字节
	buf[1] = data16 >> 8;		//高位字节

	AT24C64_W(buf,addr,2);
}

//读出一个u16型数据
u16 AT24C64_R16(uint16_t addr)
{
	u16 data16;
  	u8 buf[2];

	AT24C64_R(buf,addr,2);

	data16 = buf[1];	  		//高位字节
	data16 <<= 8;
	data16 += buf[0];			//低位字节		

	return(data16);
}  


2. 实测波形

0x00-0x04地址写0x01~0x05
在这里插入图片描述
在这里插入图片描述
MCU读ACK时机,在T2前一刻,读为0,SCL拉低后,SDA即时拉高
在这里插入图片描述
在这里插入图片描述

0x1F地址写0x1F
在这里插入图片描述
NACK
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:07:25  更:2022-03-21 21:09:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:23:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码