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

电子商务网站建设与运营方向域名 备案 没有网站

电子商务网站建设与运营方向,域名 备案 没有网站,个人网站搭建,快速的网站建设AT24C02芯片#xff08;又叫E2PROM存储器、EEPROM存储器#xff09;#xff0c;是一种通过I2C(IIC)协议通信的掉电保存存储器芯片#xff0c;其内部含有256个8位字节。在介绍这款芯片之前#xff0c;我们先来粗略了解一下I2C协议。 I2C总线是一种双向二线制的同步串行总线…AT24C02芯片又叫E2PROM存储器、EEPROM存储器是一种通过I2C(IIC)协议通信的掉电保存存储器芯片其内部含有256个8位字节。在介绍这款芯片之前我们先来粗略了解一下I2C协议。 I2C总线是一种双向二线制的同步串行总线它只需要两根线即可在连接于总线上的器件之间传送信息分别为SDA和SCL。在I2C总线上可以有若干个从机如AT24C02芯片但只能有一个主机如单片机。像不同的通信协议一样I2C协议规定了一些SDA、SCL的行为如什么时候谁置高、什么时候谁置低用以代表什么含义连在I2C总线上的器件则依靠这个规则来传输数据与接收数据。 想要深入了解I2C协议可以参考嵌入式硬件入门——EEPROMAT24C02I2C协议) 通常单片机上内置了硬件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 ADDRESSWRITE)将在下文解释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 ADDRESSWR-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 ADDRESSREAD)将在下文解释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.hvoid 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/16KA2、A1、A0分别对应电路原理图的E3、E2、E1。在下图中可以看到E1、E2、E2均接地为0。最后一位的R(Read)为1W(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.hvoid 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://www.hkea.cn/news/14359294/

相关文章:

  • 网站盈利模式设计重庆智能网站建设企业
  • 深圳网站建设好不好地图网站设计
  • 饮料企业哪个网站做的比较好短视频营销策略
  • 网站排名突然掉了怎么回事做网站cookie传值
  • 营销展示型网站模板如何寻找做网站的客户
  • 网站服务器端口设置企业推广方式有哪些
  • 做网站的公司合肥网站建设外文文献翻译
  • 怎样做投资与理财网站简单网站制作实验报告
  • 刚学完网站开发订做网站建设
  • 无锡网络公司无锡网站设计找竞价托管公司
  • 网站实现中英文深圳福田建网站
  • 网站企业备案资料长沙网站推广智投未来
  • 十大免费跨境网站seo公司多少钱
  • 页面设计制作网站山东军辉建设集团有限公司 公司网站网址
  • 导航网站怎么推广浙江省建筑培训网
  • 新手制作网站seo关键词推广优化
  • 四川省示范校建设网站网站中新颖的功能
  • 可信网站行业验证必须做吗建设部官网网站
  • python做网站用什么软件网站建设文本居中代码
  • 秦皇岛seo网站推广安徽建站优化
  • 焦作网站开发公司电话广东智慧团建系统登录入口
  • 自己建站的网站网站顶部地图代码怎么做
  • 宁波网站设计服务收费价格网站开发公司地址
  • 广州 环保 凡人网站建设p2p网站建设规划
  • 郴州网站网站建设互联网站备案
  • 网站元素优化 移动站企业管理培训课程简介
  • 爱网站长尾关键词挖掘工具网页浏览器英文缩写
  • 宁波微网站开发中国建设协会官网
  • 网站建设签收单系统开发方案设计(模板) 免费下载
  • 二维码生成器网站首都医科大学网站建设