以前只用51做过AT24C02,后来才接触到容量更大的型号,发现了很多和以前的不一致的东西,现总结如下。
在上一篇博客中已经写好了STM32用IO口模拟IIC的基本驱动代码,下面结合数据手册用上一篇博客提到的函数编写AT24CXX全系列通用的驱动代码。
我们先来看AT24CXX的中文手册。
这是写操作的步骤。
而上面提到的从器件的地址信息由下图所示。
不同的容量的AT24CXX的从器件地址位是不同的。这在后面的基本的读写函数的关于器件的不同就有所体现。
下面先初始化AT24CXX:
void AT24CXX_Init()
{
IIC_Init();
}
这里只需要初始化IIC总线即可。
下面写出AT24CXX基本的读写函数
/*在AT24CXX的指定地址读出一个数据*/
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8); //发送高地址
IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //此处需重点理解
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();
return temp;
需要重点理解处通过对于EE_TYPE宏定义的判断,也就是对于型号的选择,来实现了对于不同型号的驱动。
同理,往指定地址写入一个数据的函数如下:
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);
}else
{
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));
}
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256);
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(10); //需注意,有10ms的延时
}
至此,就完成了基本驱动代码的编写。
关键字:STM32 模拟IIC 读写AT24CXX
引用地址:
STM32模拟IIC读写AT24CXX
推荐阅读最新更新时间:2024-03-16 15:42
STM32之CAN---TTCAN模式浅析
1 前言 传统CAN 采用事件触发消息传输机制,CSMA/ CD+ AMP( Carrier-Sense Mult iple Access w ith Co llision Detect ion and Arbit ration on Message Priorit ies, 载波侦听、多路访问、冲突检测、优先级仲裁) 介质访问控制机制, 即多个消息同时发送时, 按照消息标识符的优先级顺序, 低优先级消息自动退出, 高优先级消息继续发送。这种介质访问方式提高了网络的利用率和高优先级消息的实时性, 但在重负载CAN 中, 低优先级消息经常由于总线冲突而被迫退出发送, 导致低优先级消息传输时延长, 且传输时延不可预测, 因
[单片机]
STM32_DAC输出电压
今天讲解“STM32F103 DAC输出电压”功能。 今天提供并讲解的软件工程,基于软件工程“A0.0.0(STM32F10x_TIM延时)”修改而来。若不知道如何而来,请关注微信公众号“strongerHuang获取更多信息。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPU3YIHzcu6Eu 访问密码 11f0 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 一、RCC时钟配置 该函数位
[单片机]
STM32的USART使用DMA--操作
使用STM32的DMA来处理USART3的RX的多数据 注意:DMA的中断产生条件中,TC=transfer complete interrupt产生,需要DMA的buffer满才会产生。 只有当DMA内存中的数据个数达到20个时候才能产生中断。定义如下。DMA_InitStructure.DMA_BufferSize = 20;//sizeof(Ch3DMABuffer); static usart3_dma_config(void) { DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClo
[单片机]
stm32学习笔记---计数器定时中断(1s)
#include tim_driver.h //tim2³õʼ»¯:1ÃëÖÓ¸üÐÂÊý¾Ý void tim2_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //ʹÄÜʱÖÓ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
[单片机]
STM32串口配置(基于uC/OS)
在uC/OS下,串口配置与不使用uC/OS基本相同,但中断处理有些差别。在uC/OS下取消了固件库中的stm32f10x_it.c文件,去而代之的是app_vect_v5.c. 下面是几个中断处理的函数: bsp_int.c提供几个关键的中断操作函数: void BSP_IntDis (CPU_DATA int_id) //关闭指定中断 void BSP_IntDisAll (void) //关闭所有中断 void BSP_IntEn
[单片机]
stm32 usart奇偶校验如何配置
stm32 usart奇偶校验如何配置?或许你在stm32 usart奇偶校验过程中会遇到如下一些坑,stm32 usart偶校验错误标志位以及出现偶校验错误,奇偶校验位包含在数据位中等等这些可能是你将错误的数据放到DR寄存器中导致的。 在一般情况下,stm32 usart奇偶校验无校验位时,数据位常用8位,当使用就校验位时,数据位应设置为9位。stm32 usart奇偶校验配置方法主要有以下几种: stm32 usart奇偶校验如何配置?如果stm32 usart开启奇偶校验,应在读取数据寄存器时先查看标志位,或者及时进行应用逻辑代码处理,以免发生校验错误标志则丢弃数据等情况出现造成不必要的损失。
[单片机]
【STM32】HAL库 STM32CubeMX教程八---定时器输入捕获
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: PWM工作原理 STM32CubeMX创建PWM例程 HAL库定时器PWM函数库 PWM创建呼吸灯 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非
[单片机]
uclinux下stm32开发环境搭建
什么是uclinux uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。 uClinux是嵌入式Linux领域非常重要的分支,已成功应用于路由器、机顶盒、PDA等领域,与标准Linux在内存管理方面有着本质的区别。 uCLinux是一种优秀的嵌入式Linux版本,是micro-Controll
[单片机]