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

电子商务网站建设与运营方向上海网站建设百度推广公司哪家好

电子商务网站建设与运营方向,上海网站建设百度推广公司哪家好,app运营费用预算,做数据表格的网站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/14374236/

相关文章:

  • 厦门人才网个人登录国内好的seo
  • 中山h5网站建设如何利用模板做网站
  • 做银行流水网站ps做特效哪个网站好
  • 广告公司简介模板100字页面优化的方法有哪些
  • 企业解决方案参考网站小说网站用什么虚拟主机
  • 海南网站建设推广同步网站内容怎么做
  • 网站建设的优势是什么意思现在电商做的设计用的什么网站
  • 专业做网站建设制作服务网站建设策划书封面
  • 网站优化比较好的公司个人短信接口wordpress
  • 照明工业网站建设营业执照年检入口
  • 国内flash网站怎么做拍卖网站吗
  • 做一个公司网站的费用溧阳免费做网站
  • 大良营销网站建设咨询wap是什么意思歌词
  • 搭建网站需要多少钱做公司门户网站的重点
  • 网站设计与建设作业可以发布软文的平台
  • 上海电子商务网站建设公司网络营销策划书范文
  • 网站和后台建设网页页面设计代码
  • 深圳建设企业网站公司Nginx伪静态WordPress
  • 动易网站 价格用vuejs做的网站
  • 职业教育网站平台建设培训学校管理制度大全
  • 陕西网站建设公司电话东莞公司注册地址变更流程
  • 网站目录管理模板3d网站建设
  • 上海的做网站的公司上海十佳装修公司排名
  • 用摄像头直播网站怎么做优秀网页设计教程
  • 网站模板如何使用 如何修改吗写作兼职网站
  • 做电气设计有哪些好的网站大同市建设工程招标投标网站
  • 自己做的网站在浏览器上显示不安全吗网站如何接广告赚钱
  • 谁可以教我做网站12306网站开发
  • wordpress建站事例广州海珠网站开发方案
  • 知名高端网站建设企业建一个网页需要多少钱