手动直达. UCOSII移植到STM32F103C8T6上之应用记录(二).
原因:发现公司的板子上面有一个AT24C256C,闲着也是闲着,就写一下呗。。
AT24C256Cdatasheet和AT24Cxx中文版 提取码: mwqg

目录

  • 一,AT24C256C
  • 二,软件
    • 2.1引脚配置
    • 2.2检测总线上是否有设备
    • 2.3写一个字节
    • 2.4读一个字节
    • 2.5连续写字节
    • 2.6连续读字节
    • 2.7调用

一,AT24C256C

AT24C256C是一个EEPROM,通过IIC通讯。
256K,地址16位,设备地址0xA0,512页,一页64字节。

因为我们的硬件工程师IIC引脚画反了,所以我选择软件IIC。
AT24C256C:16位地址其中有效数据只有15位,
低6(0~5)位地址表示的容量是0~63,
连续的9(6~14)位地址表示页码的范围是0~511,
在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;
数据在不同页面的存储时,地址不能自动累加,
如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。

二,软件

用的是上一章UCOS的模板。也没啥好说的,记录下程序。

2.1引脚配置

void I2C_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(I2C_SCL_GPIO_CLK | I2C_SDA_GPIO_CLK, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Pin =  I2C_SCL_PIN;GPIO_Init(I2C_SCL_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =  I2C_SDA_PIN;GPIO_Init(I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
}

2.2检测总线上是否有设备

/*** @brief  I2C_CheckDevice 检测总线上是否有设备* @input  _Address 设备地址* @output true有  false没有*/
bool I2C_CheckDevice(uint8_t _Address)
{bool ucAck;I2C_Start();        I2C_SendByte(_Address);ucAck = I2C_WaitAck();I2C_Stop();           return ucAck;
}

2.3写一个字节

/*** @brief  AT24CXX_WriteOneByte 写一个字节* @input  WriteAddr写地址   DataToWrite写数据* @output true写成功  false写失败*/
bool AT24C_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
{   I2C_Start();  /*发送写命令*/I2C_SendByte(0XA0);     if(I2C_WaitAck()==false) goto Run_Failure;/*发送地址*/I2C_SendByte(WriteAddr>>8);if(I2C_WaitAck()==false) goto Run_Failure;       I2C_SendByte(WriteAddr%256);if(I2C_WaitAck()==false) goto Run_Failure; /*发送数据*/I2C_SendByte(DataToWrite);                             if(I2C_WaitAck()==false) goto Run_Failure;                    I2C_Stop(); return true;
Run_Failure:I2C_Stop(); return false;
}

2.4读一个字节

/*** @brief  AT24C_ReadOneByte 读一个字节* @input  ReadAddr 读地址* @output temp 读到的数据*/
uint8_t AT24C_ReadOneByte(uint16_t ReadAddr)
{                 uint8_t temp=0;                                                                               I2C_Start(); /*发送写命令*/I2C_SendByte(0XA0);     if(I2C_WaitAck()==false) goto Run_Failure;/*发送地址*/I2C_SendByte(ReadAddr>>8); if(I2C_WaitAck()==false) goto Run_Failure;         I2C_SendByte(ReadAddr%256);if(I2C_WaitAck()==false) goto Run_Failure;    I2C_Start();    /*发送读命令*/I2C_SendByte(0XA1);                   if(I2C_WaitAck()==false) goto Run_Failure;  temp=I2C_ReceiveByte();          I2C_Stop();      return temp;Run_Failure:I2C_Stop(); return 0;
}

2.5连续写字节

/*** @brief  AT24C_WritePageByte 连续写字节(小于等于64字节)* @input  WriteAddr写地址 DataAddr数据地址 DataSize数据长度* @output true写成功  false写失败*/
bool AT24C_WritePageByte(uint16_t WriteAddr,uint8_t *DataAddr,uint8_t DataSize)
{uint8_t i;if(DataSize>=64||DataSize==0) return false;I2C_Start();  /*发送写命令*/I2C_SendByte(0XA0);     if(I2C_WaitAck()==false) goto Run_Failure;/*发送地址*/I2C_SendByte(WriteAddr>>8);if(I2C_WaitAck()==false) goto Run_Failure;       I2C_SendByte(WriteAddr%256);if(I2C_WaitAck()==false) goto Run_Failure; /*发送数据*/for(i=0;i<DataSize;i++){I2C_SendByte(DataAddr[i]);
//      if(I2C_WaitAck()==false) goto Run_Failure;I2C_Ack();}I2C_Stop();return true;
Run_Failure:I2C_Stop(); printf("Run_Failure:%02X\r\n",i);return false;
}

2.6连续读字节

/*** @brief  AT24C_ReadPageByte 连续读字节(小于等于64字节)* @input  ReadAddr 读地址 DataAddr数据地址 DataSize数据长度* @output temp 读到的数据*/
void AT24C_ReadPageByte(uint16_t ReadAddr,uint8_t *DataAddr,uint8_t DataSize)
{                 uint8_t i;    if(DataSize>=64||DataSize==0) return;I2C_Start(); /*发送写命令*/I2C_SendByte(0XA0);       if(I2C_WaitAck()==false) goto Run_Failure;/*发送地址*/I2C_SendByte(ReadAddr>>8); if(I2C_WaitAck()==false) goto Run_Failure;         I2C_SendByte(ReadAddr%256);if(I2C_WaitAck()==false) goto Run_Failure;    I2C_Start();    /*发送读命令*/I2C_SendByte(0XA1);                   if(I2C_WaitAck()==false) goto Run_Failure; for(i=0;i<DataSize;i++){DataAddr[i]=I2C_ReceiveByte();if (i != DataSize - 1)I2C_Ack();  elseI2C_NoAck();}      I2C_Stop();
Run_Failure:I2C_Stop();
}

2.7调用

void IICrom_App(void *padat)
{uint8_t a[3],b[3]={0x33,0x44,0x55},err;for (;;){  OSMutexPend(DispMutex, 0, &err);if(I2C_CheckDevice(EE_DEV_ADDR) == false)printf("ERROR_EEPROM!\r\n");if(AT24C_WriteOneByte(0x0000,0x40) == false)printf("ERROR_Send!\r\n");Delay_ms(10);    printf("Save:%02X\r\n",AT24C_ReadOneByte(0x0000));AT24C_WritePageByte(0x0000,b,3);Delay_ms(10);AT24C_ReadPageByte(0x0000,a,3);printf("Save:");Printf_Buff_Display(a,3);OSMutexPost(DispMutex);OSTimeDlyHMSM(0,0,1,100);}
}

UCOSII上使用AT24C256C之应用记录(三)相关推荐

  1. 从上到下打印二叉树的三种题型

    从上到下打印二叉树(一) 也就是我们所熟知的层序遍历 思路分析: 1.首先它需要返回的是一个数组,那么我们首先要做的就是new一个数组,而数组的大小需要我们遍历这棵二叉树计算出来 2. 当我们申请完数 ...

  2. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  3. 如何在阿里云上搭建个人网站(学习记录)

    如何在阿里云上搭建个人网站(学习记录) 第一次写博客记录学习的过程,不仅可以巩固学习知识,也方便日后复习.并且可以记录自己的成长. 先购买阿里ECS云服务器 购买网站https://promotion ...

  4. dropzone拖拽上传组件使用全记录

    原文链接: dropzone拖拽上传组件使用全记录 公司有一个需求是把附件上传优化成可以通过拖拽本地文件来上传的效果,找了一圈都没有找到特别简单好用的组件,最后还是决定使用github上1.6万sta ...

  5. css学习记录三:文本属性

    css学习记录三:CSS文本属性 一.文本属性的作用 二.文本颜色 三.文本对齐 四.装饰文本 五.文本缩进 六.行间距 一.文本属性的作用 CSSS Text(文本)属性可定义文本的外观,比如文本的 ...

  6. 中软实习培训记录三(0722)

    中软实习培训记录三(0722) SSM项目概述 SSM项目Demo实现过程--登陆 SSM项目Demo扩展--用户查看 SSM项目Demo扩展--用户添加 SSM项目Demo扩展--用户删除 SSM项 ...

  7. Kafka学习记录(三)——Broker

    Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...

  8. 从根上理解高性能、高并发(三):深入操作系统,彻底理解I/O多路复用

    本文原题"终于明白了,一文彻底理解I/O多路复用",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什 ...

  9. 三星java3倍拍照手机_三星史上拍照最强后置三摄手机,果不其然:这次让你们欣赏大片...

    原标题:三星史上拍照最强后置三摄手机,果不其然:这次让你们欣赏大片 古时候,人们想要一张漂亮的风景照,都需要找到画师绘画,那个时候还不叫照片,而是画.如果你在那个时候想要一张自己模样的画,则需要一动不 ...

最新文章

  1. 基于PSO算法的带时间窗的车辆路径问题的仿真
  2. 开放下载!《深入浅出玩转物联网平台》
  3. 安装apache2.4.10
  4. 【JUC】CountDownLatch
  5. markdown学习/mou
  6. Java网络编程1---基础
  7. c++图的创建_利用Microsoft Visio 软件绘制工艺流程图
  8. matlab单行注释,matlab注释
  9. 基于网页分析构思出的正文提取算法
  10. 物联网学习之路——物联网通信技术简介
  11. Yate for Mac(音乐标签管理工具)
  12. 中国人民大学计算机拟录取,2016年中国人民大学信息学院硕士研究生拟录取名单...
  13. 基于YOLOV5的自动瞄准(附代码)
  14. 深度linux密码忘记,deepin密码忘了怎么办_deepin分区方案
  15. 普元软件工作环境大揭秘
  16. 2020 年 6 月程序员工资统计,平均 14XXX 元,网友:又跌了!
  17. 三、JumpServer堡垒机用户使用手册
  18. 计算机工作站,大厂设计专用出差笔记本?戴尔3551+代图形设计工作站
  19. 疯狂试探mysql单表insert极限:已实现每秒插入8.5w条数据
  20. c语言关于数组输入的两种方式

热门文章

  1. 冲击python二级——布尔操作符,比较操作符,控制流的基础
  2. 动态磁盘和基本磁盘的简要介绍
  3. 洛谷 P1772 [ZJOI2006]物流运输
  4. 关于计算机科技协会的标语,科技创新宣传口号(精选50条)
  5. LeeCode 第 314 场周赛
  6. 计算机硬盘内存不足,电脑提示磁盘空间不足怎么办
  7. VSCode全套配置C++环境流程(完全卸载+C盘插件搬家+json配置文件+闪退问题+中文乱码问题)
  8. 阿里巴巴 淘宝数据内核月报 目录(2014--2017)
  9. 请把我埋在新闻联播里
  10. Bugly使用记录——异常上报