STM32 IIC读写AT24C02(二)

上次已经完成了iic读写at24c02的协议层,现在开始编写读写at24c02的驱动函数。先从单字节的读写开始。
字节写要求在接收器件地址和ack应答后,接收位的字地址。接收到这个地址后at24c02应答“0”,然后是一个8位数据。在接收8位数据后,at24c02应答“0”,接着必须由主器件发送停止条件来终止写序列。
此时at24c02进入内部写周期twr,数据写入非易失性存储器中,在此期间所有输入都无效。直到写周期完成,at24c02才会有应答。
void at24c02_bytewrite(u8 wordadd,u8 dat,s8 *err){ u8 ack = 0; iic_start(); iic_sendbyte(at24c02_add< <1); ack = iic_checkack(); if(ack != 0) //发器件地址 { iic_stop(); //不应答 err = -1; return; } iic_sendbyte(wordadd); //发字地址 ack = iic_checkack(); if(ack != 0) //不应答 { iic_stop(); *err = -2; return; } iic_sendbyte(dat); //发数据 ack = iic_checkack(); if(ack != 0) //不应答 { iic_stop(); *err = -3; return; } iic_stop(); *err = 0; }其中传入了一个错误检测err,是在测试程序时为了快速发现错误位置而设置的。如果出现错误,就发送停止信号并用return退出该次写操作,由于该函数为void类型,所以直接return就可以了,不用带返回值。
和字节写相对应的是随机读,读取任意一个地址的数据。
随机读需先写一个目标字地址,一旦at24c02接收器件地址和字地址并应答了ack,主器件就产生一个重复的起始条件。
然后,主器件发送器件地址,at24c02应答ack,并随时钟送出数据。主器件无需应答“0”,但需发送停止条件。
u8 at24c02_randomread(u8 wordadd,s8 *err){ u8 ack = 0; u8 temp = 0; iic_start(); iic_sendbyte(at24c02_add< <1);//发器件地址 ack = iic_checkack(); if(ack != 0) //不应答 { iic_stop(); *err = -4; goto loop; } iic_sendbyte(wordadd); //发字地址 ack = iic_checkack(); if(ack != 0) //不应答 { iic_stop(); *err = -5; goto loop; } iic_start(); iic_sendbyte(at24c02_add< <1 | 1);//发器件地址(读) ack = iic_checkack(); if(ack != 0) //不应答 { iic_stop(); *err = -6; goto loop; } temp = iic_readbyte(); iic_noacktoslave(); iic_stop(); *err = 0;loop: return temp;}跟写字节一样,这里也引入了err判断错误,出现错误发送停止信号并退出该次读操作。因为该函数需要返回值,所以这里不能像上面那样直接return,但是出现错误,也不能让return带着一个未知的数返回。这里退出该次读操作用到了c语言中很忌讳的goto,直接让程序跳到想要的位置。这种方式来做处理在嵌入式中是比较常见的,虽然c语言中goto是不被推荐使用的,但是只要能把它用的好,就可以大胆的用。
字节读写函数封装完成后,直接在主函数中调用。at24c02擦写次数只有100万次左右,所以写函数不可以放入while循环中,否则器件可能很快就坏了。
主文件
#include stm32f4xx.h#include led.h#include usart.h#include delay.h#include stdio.h#include at24c02.hint main(){ s8 err = 0; u8 temp = 0; usart1_init(115200); led_init(); //初始化led灯 at24c02_init(); at24c02_bytewrite(0x05,125,&err); temp = at24c02_randomread(0x05,&err); printf(temp = %drn,temp); while(1) { }}
将程序烧入开发板中,打开串口助手,可以看到读到的数正好是写入的数,at24c02单字节读写成功。

LED路灯驱动及智能调光系统设计
变速器轴承受力分析与失效改善
大数据平台支撑可执行的儿童体温手表方案
氮化镓技术概念股
肖特基势垒二极管的作用 肖特基势垒二极管的工作原理
STM32 IIC读写AT24C02(二)
趋肤效应计算公式_趋肤效应和趋肤深度
安防行业通过与智慧物流的结合 将获取到更多的市场份额
新智认知数字警务合成指挥解决方案助力公安机关完成作战任务
液晶面板价格再度跳水,电视整机价格也受到牵连
Read系统调用在用户空间中的处理过程
STM32+MS5611测气压温度例程详解
已通过 AEC-Q200 认证的 TT Electronics 微型电感器属于低剖面电感器
领先全球!新华三集团Wi-Fi 7AP新品发布
dfrobot蓝牙4.0无线手柄 V2.0简介
无线网络电磁干扰屏蔽技术及应用
怎样使用Witty板和Arduino IDE对ESP8266MOD ESP-12模块进行编程/闪存
汇顶科技提供的芯片+算法的车规级触控整体解决方案
联想S5和荣耀畅玩7C哪个好
国内IDM半导体龙头企业华润微电子授权世强硬创代理