当前位置: 首页 > news >正文

广州智能模板建站十大搜索引擎神器

广州智能模板建站,十大搜索引擎神器,怎么搭建一个网站教程,ping wordpressAT24C02芯片(又叫E2PROM存储器、EEPROM存储器),是一种通过I2C(IIC)协议通信的掉电保存存储器芯片,其内部含有256个8位字节。在介绍这款芯片之前,我们先来粗略了解一下I2C协议。 I2C总线是一种双向二线制的同步串行总线…

AT24C02芯片(又叫E2PROM存储器、EEPROM存储器),是一种通过I2C(IIC)协议通信的掉电保存存储器芯片,其内部含有256个8位字节在介绍这款芯片之前,我们先来粗略了解一下I2C协议。

I2C总线是一种双向二线制的同步串行总线,它只需要两根线即可在连接于总线上的器件之间传送信息(分别为SDA和SCL)。在I2C总线上,可以有若干个从机(如AT24C02芯片),但只能有一个主机(如单片机)。像不同的通信协议一样,I2C协议规定了一些SDA、SCL的行为(如什么时候谁置高、什么时候谁置低,用以代表什么含义),连在I2C总线上的器件则依靠这个规则来传输数据与接收数据。

(想要深入了解I2C协议,可以参考嵌入式硬件入门——EEPROM(AT24C02+I2C协议))

通常,单片机上内置了硬件I2C。开启硬件I2C,并使用相应的HAL库函数,单片机中的硬件I2C就会按照其已经设定好的I2C协议与别的I2C器件进行通信。与硬件I2C相对的,还有软件I2C。软件I2C是指按照I2C协议,自行用两个GPIO端口置高或低模拟SDA和SCL的行为。在比赛方提供的资源数据包——底层驱动代码参考中,有用HAL库函数实现的软件I2C的库,我们就基于这个库来使用AT24C02芯片(E2PROM存储器)进行读写操作。

打开电路原理图(CT117E-M4产品手册),可以看到STM32G431RBT6的24C02芯片被挂到了PB6、PB7上(相当于I2C总线的SDA和SCL):

因此,我们需要在Cube中将PB6和PB7设置为GPIO输出模式。

设置完成后,需要调用比赛方提供的软件I2C库:i2c_hal.c和i2c_hal.h,我们需要用到的函数如下:

/*** @brief I2C起始信号* @param None* @retval None*/
void I2CStart(void);/*** @brief I2C结束信号* @param None* @retval None*/
void I2CStop(void);/*** @brief I2C等待确认信号* @param None* @retval None*/
unsigned char I2CWaitAck(void);/*** @brief I2C发送一个字节* @param cSendByte 需要发送的字节* @retval None*/
void I2CSendByte(unsigned char cSendByte);/*** @brief I2C接收一个字节* @param None* @retval 接收到的字节*/
unsigned char I2CReceiveByte(void);

下面,我们来看看如何利用这些函数来进行E2PROM的读写操作。

打开AT24C02芯片手册(在选手资源数据包——芯片资料中),可以找到向E2PROM写入数据与读取数据(读取内存)的流程图:

 

对应流程图,我们就可以编写E2PROM的读写操作函数如下:

/* e2prom.c */#include "e2prom.h"/* E2PROM写操作,对应Figure 8. Btye Write */
void e2prom_write(unsigned char address, unsigned char info)
{I2CStart();              //1.I2C起始信号(START)I2CSendByte(0xa0);       //2.发送设备地址与“写”信号(DEVICE ADDRESS+WRITE),将在下文解释I2CWaitAck();            //3.IC2等待确认信号(ACK)I2CSendByte(address);    //4.发送数据存储地址(WORD ADDRESS)(可以为0~255,对应256个)I2CWaitAck();            //5.I2C等待确认信号(ACK)I2CSendByte(info);       //6.发送数据(DATA)I2CWaitAck();            //7.I2C等待确认信号(ACK)I2CStop();               //8.I2C结束信号(STOP)
}/* E2PROM读操作,对应Figure 11. Random Read */
unsigned char e2prom_read(unsigned char address)
{unsigned char val;I2CStart();              //1.I2C起始信号(START)I2CSendByte(0xa0);       //2.发送设备地址与“写”信号(DEVICE ADDRESS+WR-TE),将在下文解释I2CWaitAck();            //3.IC2等待确认信号(ACK)I2CSendByte(address);    //4.发送数据存储地址(WORD ADDRESS)(可以为0~255,对应256个)I2CWaitAck();            //5.I2C等待确认信号(ACK)I2CStart();              //6.I2C起始信号(START)I2CSendByte(0xa1);       //7.发送设备地址与“读”信号(DEVICE ADDRESS+READ),将在下文解释I2CWaitAck();            //8.I2C等待确认信号(ACK)val = I2CReceiveByte();  //9.接收数据(DATA)I2CWaitAck();            //10.I2C等待确认信号(NO ACK)I2CStop();               //11.I2C结束信号(STOP)return (val);
}
/* e2prom.h */#ifndef __E2PROM_H
#define __E2PROM_H#include "main.h"
#include "i2c_hal.h"void e2prom_write(unsigned char address, unsigned char info);
unsigned char e2prom_read(unsigned char address);#endif /* __E2PROM_H */

下面来解释一下为什么第二步和第七步发送的是0xa0和0xa1。同样在芯片手册中,可以找到AT24C02芯片的地址:

AT24C01/02/04/08/16分别对应1K/2K/4K/8K/16K,A2、A1、A0分别对应电路原理图的E3、E2、E1。在下图中可以看到,E1、E2、E2均接地,为0。最后一位的R(Read)为1,W(Write)为0。因此,在STM32G431RBT6中,AT24C02的地址为1010000_(即0xa_),最后一位视读或写操作为1或0。

通过调用我们自己编写的e2prom的库,就可以使用E2PROM存储器进行简单的8位数据(unsigned char或uint8_t类型)的存储操作了。

附录

i2c_hal.c

/*程序说明: CT117E-M4嵌入式竞赛板GPIO模拟I2C总线驱动程序软件环境: MDK-ARM HAL库硬件环境: CT117E-M4嵌入式竞赛板日    期: 2020-3-1
*/#include "i2c_hal.h"#define DELAY_TIME	20/*** @brief SDA线输入模式配置* @param None* @retval None*/
void SDA_Input_Mode()
{GPIO_InitTypeDef GPIO_InitStructure = {0};GPIO_InitStructure.Pin = GPIO_PIN_7;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;GPIO_InitStructure.Pull = GPIO_PULLUP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}/*** @brief SDA线输出模式配置* @param None* @retval None*/
void SDA_Output_Mode()
{GPIO_InitTypeDef GPIO_InitStructure = {0};GPIO_InitStructure.Pin = GPIO_PIN_7;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}/*** @brief SDA线输出一个位* @param val 输出的数据* @retval None*/
void SDA_Output( uint16_t val )
{if ( val ){GPIOB->BSRR |= GPIO_PIN_7;}else{GPIOB->BRR |= GPIO_PIN_7;}
}/*** @brief SCL线输出一个位* @param val 输出的数据* @retval None*/
void SCL_Output( uint16_t val )
{if ( val ){GPIOB->BSRR |= GPIO_PIN_6;}else{GPIOB->BRR |= GPIO_PIN_6;}
}/*** @brief SDA输入一位* @param None* @retval GPIO读入一位*/
uint8_t SDA_Input(void)
{if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET){return 1;}else{return 0;}
}/*** @brief I2C的短暂延时* @param None* @retval None*/
static void delay1(unsigned int n)
{uint32_t i;for ( i = 0; i < n; ++i);
}/*** @brief I2C起始信号* @param None* @retval None*/
void I2CStart(void)
{SDA_Output(1);delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);SDA_Output(0);delay1(DELAY_TIME);SCL_Output(0);delay1(DELAY_TIME);
}/*** @brief I2C结束信号* @param None* @retval None*/
void I2CStop(void)
{SCL_Output(0);delay1(DELAY_TIME);SDA_Output(0);delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);SDA_Output(1);delay1(DELAY_TIME);}/*** @brief I2C等待确认信号* @param None* @retval None*/
unsigned char I2CWaitAck(void)
{unsigned short cErrTime = 5;SDA_Input_Mode();delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);while(SDA_Input()){cErrTime--;delay1(DELAY_TIME);if (0 == cErrTime){SDA_Output_Mode();I2CStop();return ERROR;}}SDA_Output_Mode();SCL_Output(0);delay1(DELAY_TIME);return SUCCESS;
}/*** @brief I2C发送确认信号* @param None* @retval None*/
void I2CSendAck(void)
{SDA_Output(0);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);SCL_Output(0);delay1(DELAY_TIME);}/*** @brief I2C发送非确认信号* @param None* @retval None*/
void I2CSendNotAck(void)
{SDA_Output(1);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);SCL_Output(0);delay1(DELAY_TIME);}/*** @brief I2C发送一个字节* @param cSendByte 需要发送的字节* @retval None*/
void I2CSendByte(unsigned char cSendByte)
{unsigned char  i = 8;while (i--){SCL_Output(0);delay1(DELAY_TIME);SDA_Output(cSendByte & 0x80);delay1(DELAY_TIME);cSendByte += cSendByte;delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);}SCL_Output(0);delay1(DELAY_TIME);
}/*** @brief I2C接收一个字节* @param None* @retval 接收到的字节*/
unsigned char I2CReceiveByte(void)
{unsigned char i = 8;unsigned char cR_Byte = 0;SDA_Input_Mode();while (i--){cR_Byte += cR_Byte;SCL_Output(0);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);cR_Byte |=  SDA_Input();}SCL_Output(0);delay1(DELAY_TIME);SDA_Output_Mode();return cR_Byte;
}//
void I2CInit(void)
{GPIO_InitTypeDef GPIO_InitStructure = {0};GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_6;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Pull = GPIO_PULLUP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}

i2c_hal.h

#ifndef __I2C_HAL_H
#define __I2C_HAL_H#include "stm32g4xx_hal.h"void I2CStart(void);
void I2CStop(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(void);
void I2CSendNotAck(void);
void I2CSendByte(unsigned char cSendByte);
unsigned char I2CReceiveByte(void);
void I2CInit(void);#endif

文章转载自:
http://wanjianatriuresis.gtqx.cn
http://wanjiaknew.gtqx.cn
http://wanjiafrigging.gtqx.cn
http://wanjiaerma.gtqx.cn
http://wanjiaexcitative.gtqx.cn
http://wanjiaqualifier.gtqx.cn
http://wanjiapetrolic.gtqx.cn
http://wanjiaroumansh.gtqx.cn
http://wanjiamipmap.gtqx.cn
http://wanjiariverine.gtqx.cn
http://wanjiacomplainant.gtqx.cn
http://wanjiainsolubility.gtqx.cn
http://wanjiavaccination.gtqx.cn
http://wanjiaexcardination.gtqx.cn
http://wanjiaopaquely.gtqx.cn
http://wanjiableeder.gtqx.cn
http://wanjiadepot.gtqx.cn
http://wanjiainfant.gtqx.cn
http://wanjialemnian.gtqx.cn
http://wanjiasuppliance.gtqx.cn
http://wanjiaadlittoral.gtqx.cn
http://wanjiarhapsodical.gtqx.cn
http://wanjiavocoid.gtqx.cn
http://wanjiaantalgic.gtqx.cn
http://wanjiaforth.gtqx.cn
http://wanjiadefalcate.gtqx.cn
http://wanjiacaliforniate.gtqx.cn
http://wanjiaboatel.gtqx.cn
http://wanjiatableware.gtqx.cn
http://wanjiabailey.gtqx.cn
http://wanjiacollunarium.gtqx.cn
http://wanjiacollutory.gtqx.cn
http://wanjiaheating.gtqx.cn
http://wanjialifeway.gtqx.cn
http://wanjiaunderdo.gtqx.cn
http://wanjiafacete.gtqx.cn
http://wanjiapredigestion.gtqx.cn
http://wanjiaspanish.gtqx.cn
http://wanjiavideodisc.gtqx.cn
http://wanjiaoblivious.gtqx.cn
http://wanjiainterlocutor.gtqx.cn
http://wanjiaphysiographic.gtqx.cn
http://wanjiainstalment.gtqx.cn
http://wanjiasawdust.gtqx.cn
http://wanjiapolysorbate.gtqx.cn
http://wanjiaexlex.gtqx.cn
http://wanjiawilla.gtqx.cn
http://wanjiaunderlip.gtqx.cn
http://wanjiavirulency.gtqx.cn
http://wanjiaexpectative.gtqx.cn
http://wanjiaomnicompetent.gtqx.cn
http://wanjiaseafloor.gtqx.cn
http://wanjiagrotesquerie.gtqx.cn
http://wanjiatapeworm.gtqx.cn
http://wanjiaecumene.gtqx.cn
http://wanjiatrieteric.gtqx.cn
http://wanjiaethidium.gtqx.cn
http://wanjiahaplobiont.gtqx.cn
http://wanjiaorison.gtqx.cn
http://wanjiacoleopteron.gtqx.cn
http://wanjiaanatomist.gtqx.cn
http://wanjiacontrecoup.gtqx.cn
http://wanjiaeft.gtqx.cn
http://wanjialowermost.gtqx.cn
http://wanjiarabbet.gtqx.cn
http://wanjiabalcony.gtqx.cn
http://wanjiaimprecise.gtqx.cn
http://wanjiacrushproof.gtqx.cn
http://wanjiashicker.gtqx.cn
http://wanjiamaypole.gtqx.cn
http://wanjiapetrological.gtqx.cn
http://wanjiasuffrutescent.gtqx.cn
http://wanjiaphotochromism.gtqx.cn
http://wanjiaeptitude.gtqx.cn
http://wanjiaorder.gtqx.cn
http://wanjiablowpipe.gtqx.cn
http://wanjiautility.gtqx.cn
http://wanjiabunchgrass.gtqx.cn
http://wanjiawhisker.gtqx.cn
http://wanjiakerala.gtqx.cn
http://www.15wanjia.com/news/114956.html

相关文章:

  • 莱芜最好的网站建设公司百度搜索app免费下载
  • 行情网免费网站大全不需要验证码的广告平台
  • 标准型网站建设委托合同静态网页设计与制作
  • ui设计的推荐网站及网址厦门seo关键词优化培训
  • 巴中住房建设部网站苏州百度推广排名优化
  • wordpress简码插件楚雄seo
  • 网站建设技术人员要求高质量外链购买
  • 阳信住房和城乡建设厅网站zac seo博客
  • 网站的广告语应该怎么做开源cms建站系统
  • 网站做等保二级收费多少网上怎么找客户资源
  • 怎么做游戏网站的宣传图片推广网络营销案例
  • 半商城性质网站源代码网站运营包括哪些内容
  • 有的网站显示正在建设中html网页制作成品
  • wordpress建站主题西安seo关键词排名优化
  • 做影视外包的网站电商培训视频教程
  • 博客网站开发背景及作用一媒体app软件下载老版本
  • 做艺术的网站营销策划公司名称
  • 韩国时尚网站欣赏宁德市
  • 电商如何推广产品上优化seo
  • 石油大学 网页设计与网站建设怎么接广告赚钱
  • 为什么做美食视频网站营销网站建设大概费用
  • 广州市网站设计营销策略包括哪些内容
  • 南京公司网站建设seo上海推广公司
  • 深圳电子商务网站开发国际时事新闻2022最新
  • 哈尔滨制作网站多少钱seo教程seo官网优化详细方法
  • 如何建立自己免费网站青岛建站seo公司
  • 珠海移动网站建设报价手机网站seo免费软件
  • 空间手机版网站目录建设seo的中文含义
  • 网上学习做网站汽车seo是什么意思
  • 人跟狗做网站域名污染查询网站