1. I2C 概述
参考该链接,不在赘述:https://blog.csdn.net/XieWinter/article/details/91903678
介于ST I2C接口相对不好用,在此直接采用模拟I2C方式操作设备
2. 硬件设计
特征:兼容400KHZ,百万次写入,详见数据手册
EEPROM的7位设备地址是:,A0/A1/A2均为0, 0x50
EEPROM芯片中还有一个WP引脚,具有写保护功能,当该引脚电平为高时,禁止写入数据,当引脚为低电平时,可写入数据,直接接地,则禁用写保护功能。
EEPROM操作图
字节写
页写
当前地址读
随机读
顺序读
3. 代码实现
模拟I2C源码链接:https://download.csdn.net/download/xiewinter/11258552
/******************************************************************************
Copyright(c) 2018-2020 Xanthium All rights reserved.
******************************************************************************
文 件 名 : bsp_i2c_gpio.h
版 本 号 : 初稿
作 者 : Xanthium
生成日期 : 2019年6月25日
最近修改 :
功能描述 : I2C模拟总线驱动模块H文件
函数列表 :
修改历史 :
1.日 期 : 2019年6月25日
作 者 : Xanthium
修改内容 : 创建文件
******************************************************************************/
#ifndef __BSP_I2C_GPIO_H__
#define __BSP_I2C_GPIO_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32f4xx.h"
#define I2C_WR 0 /* 写控制bit */
#define I2C_RD 1 /* 读控制bit */
void bsp_InitI2C(void);
void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);
#ifdef __cplusplus
}
#endif
#endif // end of __BSP_I2C_GPIO_H__
/* -------------- 部分代码---------完整代码见个人资源库*/
/*
i2c总线GPIO:
PB6/I2C1_SCL
PB7/I2C1_SDA
*/
/* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define RCC_I2C_PORT RCC_AHB1Periph_GPIOB /* GPIO端口时钟 */
#define PORT_I2C_SCL GPIOB /* GPIO端口 */
#define PIN_I2C_SCL GPIO_Pin_6 /* GPIO引脚 */
#define PORT_I2C_SDA GPIOB /* GPIO端口 */
#define PIN_I2C_SDA GPIO_Pin_7 /* GPIO引脚 */
#define I2C_SCL_PIN GPIO_Pin_6 /* 连接到SCL时钟线的GPIO */
#define I2C_SDA_PIN GPIO_Pin_7 /* 连接到SDA数据线的GPIO */
/* 定义读写SCL和SDA的宏 */
#define I2C_SCL_1() GPIO_SetBits(PORT_I2C_SCL,I2C_SCL_PIN) /* SCL = 1 */
#define I2C_SCL_0() GPIO_ResetBits(PORT_I2C_SCL,I2C_SCL_PIN) /* SCL = 0 */
#define I2C_SDA_1() GPIO_SetBits(PORT_I2C_SDA,I2C_SDA_PIN) /* SDA = 1 */
#define I2C_SDA_0() GPIO_ResetBits(PORT_I2C_SDA,I2C_SDA_PIN) /* SDA = 0 */
#define I2C_SDA_READ() (GPIO_ReadInputDataBit(PORT_I2C_SDA,I2C_SDA_PIN)) /* 读SDA口线状态 */
#define I2C_SCL_READ() (GPIO_ReadInputDataBit(PORT_I2C_SCL,I2C_SCL_PIN)) /* 读SCL口线状态 */
/*
*********************************************************************************************************
* 函 数 名: bsp_InitI2C
* 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitI2C(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /* 开漏输出模式 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = PIN_I2C_SCL;
GPIO_Init(PORT_I2C_SCL, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_I2C_SDA;
GPIO_Init(PORT_I2C_SDA, &GPIO_InitStructure);
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
i2c_Stop();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线启动信号
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
I2C_SDA_1();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_0();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线停止信号
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{
/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
I2C_SDA_0();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_1();
i2c_Delay();
}
// ....
/******************************************************************************
Copyright(c) 2018-2020 Xanthium All rights reserved.
******************************************************************************
文 件 名 : bsp_eeprom_24xx.h
版 本 号 : 初稿
作 者 : Xanthium
生成日期 : 2019年6月25日
最近修改 :
功能描述 : 串行EEPROM 24xx02驱动模块H文件
函数列表 :
修改历史 :
1.日 期 : 2019年6月25日
作 者 : Xanthium
修改内容 : 创建文件
******************************************************************************/
#ifndef __BSP_EEPROM_24XX_H__
#define __BSP_EEPROM_24XX_H__
#ifdef __cplusplus
extern "C" {
#endif
#include #define AT24C02 //#define AT24C128 #ifdef AT24C02 #define EE_MODEL_NAME "AT24C02" #define EE_DEV_ADDR 0xA0 /* 设备地址 */ #define EE_PAGE_SIZE 8 /* 页面大小(字节) */ #define EE_SIZE 256 /* 总容量(字节) */ #define EE_ADDR_BYTES 1 /* 地址字节个数 */ #endif #ifdef AT24C128 #define EE_MODEL_NAME "AT24C128" #define EE_DEV_ADDR 0xA0 /* 设备地址 */ #define EE_PAGE_SIZE 64 /* 页面大小(字节) */ #define EE_SIZE (16*1024) /* 总容量(字节) */ #define EE_ADDR_BYTES 2 /* 地址字节个数 */ #endif uint8_t bsp_ee_CheckOk(void); uint8_t bsp_ee_ReadBytes(uint8_t *_pReadBuf, uint16_t _usAddress, uint16_t _usSize); uint8_t bsp_ee_WriteBytes(uint8_t *_pWriteBuf, uint16_t _usAddress, uint16_t _usSize); #ifdef __cplusplus } #endif #endif // end of __BSP_EEPROM_24XX_H_
上一篇:秉火429笔记之十八 ETH--以太网
下一篇:秉火429笔记之五控制RGB彩灯
推荐阅读
史海拾趣
Anixter Inc 是一家全球性的供应链解决方案提供商,以下是该公司发展的相关故事:
公司成立与初期发展:Anixter Inc 成立于 1957 年,总部位于美国伊利诺伊州格伦维尔回。最初,公司主要从事电线电缆的销售和分销。随着时间的推移,Anixter 不断扩大业务范围,逐步涉足网络设备、安全解决方案、电子元器件等领域。
业务拓展与国际化:随着市场需求的变化和全球化的趋势,Anixter 不断拓展业务,并加速国际化进程。公司在全球范围内建立了广泛的分销网络和供应链体系,在北美、欧洲、亚洲和拉丁美洲等地区设立了办事处、仓库和物流中心,以更好地满足客户的需求。
技术创新与解决方案提供:Anixter 不断注重技术创新和解决方案提供,与各种供应商合作,推出了多种先进的产品和服务。公司致力于为客户提供全方位的供应链解决方案,包括设计、采购、仓储、配送和技术支持等,帮助客户提高效率、降低成本并增强竞争力。
收购与合并:为了加速业务发展和扩大市场份额,Anixter 进行了一系列收购和合并活动。通过收购具有特定技术或地区优势的公司,Anixter 不仅增强了自身的竞争实力,还拓展了业务领域和市场覆盖范围。
可持续发展与未来展望:Anixter 积极响应可持续发展的呼声,致力于推动环保和社会责任的实践。公司在供应链管理、能源管理和环境保护等方面持续改进,致力于减少碳排放、资源浪费和环境污染。未来,Anixter 将继续秉承技术创新和客户导向的理念,不断适应市场变化和挑战,保持行业领先地位,并为客户和股东创造持续增长的价值。
在电子行业的初期,CANDD公司凭借其创始人对半导体技术的深入研究,成功开发出了一款具有划时代意义的芯片。这款芯片不仅性能卓越,而且成本远低于市场上的同类产品。凭借这一技术突破,CANDD公司迅速在行业内崭露头角,吸引了大量投资者的关注。随着产品销量的不断增长,公司逐渐扩大了生产规模,并在全球范围内建立了销售网络。
Dolphin Interconnect Solutions ASA自创立之初,便以技术革新为核心驱动力。公司不断投入研发资源,开发出了基于PCI Express的I/O和clustering产品,这些产品在市场上取得了显著的成功。随着技术的不断进步,Dolphin又成功地将产品扩展到更广泛的领域,如云计算、大数据处理等,进一步巩固了其在电子行业的地位。
Dolphin Interconnect Solutions ASA深知创新是企业发展的根本动力。因此,公司不断投入研发资源,鼓励员工进行创新实践。同时,Dolphin还注重人才培养和引进,建立了一支高素质、专业化的技术团队。这些人才为公司的发展提供了源源不断的创新动力。
随着公司规模的扩大和业务范围的拓展,Fenfa Electronics Ltd公司面临着越来越复杂的供应链管理问题。为了应对这一挑战,公司决定优化供应链管理流程。Fenfa与供应商建立了长期稳定的合作关系,实现了原材料的稳定供应和成本的优化控制。同时,公司还加强了仓储和物流的管理,提高了产品的运输效率和交付速度。这些措施的实施,使Fenfa Electronics Ltd公司的供应链管理更加高效、灵活和可靠。
随着市场需求的不断变化,Autotrol公司意识到必须不断进行技术创新和产品升级,以满足客户的多样化需求。于是,公司投入大量研发资源,开发出了一系列特色产品,如为更大转矩而制的铜或铁齿轮传动链,以及为安静运行并省钱而特制的塑料齿轮传动链等。这些创新产品不仅提升了Autotrol在市场上的竞争力,也为公司带来了可观的收益。
汽车电子化被认为是汽车技术发展进程中的一次革命,汽车电子化的程度被看作是衡量现代汽车水平的重要标志,是用来开发新车型,改进汽车性能最重要的技术措施。汽车制造商认为增加汽车电子设备的数量、促进汽车电子化是夺取未来汽车市场的重要的有效 ...… 查看全部问答∨ |
引 言 在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式 ...… 查看全部问答∨ |
在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。 很多年前,一位开发人员为了对嵌入式有更深层次的理解 ...… 查看全部问答∨ |
|
用directshow做camera程序,得到的图像画面是倒立的,当弹出messagebox后又变成正立(正常)画面,请是这是为什么? 用directshow做camera程序,得到的图像画面是倒立的,当弹出messagebox后又变成正立(正常)画面,请是这是为什么? … 查看全部问答∨ |
c语言功底扎实,能快速完成简单数据结构链表,队列程序的编写,了解嵌入式linux开发。对基本的驱动程序编写原理了解。对GUI机制有所了解。待遇面谈。应届和工作1-2年的即可! 有意者请发简历到efly2008@qq.com… 查看全部问答∨ |
用PB订制内核时,如何让被定制的内核跟手边的特定硬件平台相关联? 在定制嵌入式XP内核时,是通过在目标硬件平台上运行一个工具,然后生成一个硬件平台信息文件,接着通过这个文件来订制内核的,很显然,这个信息文件就把系统跟目标硬件联系起来了,换句话说,这样生成的嵌入式系统是基于这个目标硬件平台的。初次学 ...… 查看全部问答∨ |
我们知道,P45是Intel LGA775平台的最后一款主流芯片组,而它的继任者是面向LGA1160平台的“Ibex Peak”,命名很简单:P55。 即将推出的X58虽然也是5系列芯片组,但仅用于高端LGA1366平台,支持Bloomfield Core i7系列处理器。 P55主要搭配代号Ly ...… 查看全部问答∨ |