0%

stm32_note_13day

=============================
2022-8-31
=============================

一.温故知新

    串口之I²C
    1.I²C总线中包含两条线(SDA数据线 和 SCL时钟线)
    2.I²C总线上可以连接很多的I²C接口的设备,设备与设备之间都串联起来的
    3.I²C总线规定了,凡是连接到I²C总线上的设备都需要有一个设备地址
        一般来说设备地址是7bit
    4.I²C总线上的设备需要区分主设备和从设备
    5.如果I²C总线上的两个设备都想要和另外的一个设备通信,会触发抢主机制
        抢主机制 : 谁先产生开始信号,谁就优先通信
    6.I²C总线规定了,在空闲状态下SDA和SCL要保持高电平的状态
        所以I²C总线需要外接上拉电阻
    7.开始信号和结束信号
        开始信号 : 在SCL为高电平时,SDA由高电平拉到低电平
        结束信号 : 在SCL为高电平时,SDA由低电平拉到高电平
    8.传输数据
        1)在SCL为低电平的时候,把数据放到SDA数据线上
        2)拉高SCL,延时一段时间,(当SCL为高电平时,SDA保持不变)
        3)拉低SCL,切换下一位数据放到SDA数据线上
    9.传输一个字节数据需要9个周期 = 8个数据周期 + 1个ACK周期
    A.I²C总线属于停等式的流控,传输完一个字节数据需要有应答
    B.产生ACK和读取ACK
        1)产生ACK : 在第9个周期,拉低SCL,把SDA也拉低,拉高SCL
        2)读取ACK : 在第9个周期,当SCL为高电平时,读取SDA的电平
    C.I²C总线是高位先出
    D.主设备给从设备发送数据
        1)主设备产生开始信号
        2)主设备发送从设备的设备地址 + 写的标志(0)
        3)主设备等待ACK
        4)主设备发送一个字节数据
        5)主设备等待ACK
        ...
        n)主设备发送最后一个字节数据
        n+1)主设备可以等待或者不等待ACK
        n+2)主设备产生结束信号
    E.主设备读取从设备的数据
        1)主设备产生开始信号
        2)主设备发送从设备的设备地址 + 读的标志(1)
        3)主设备等待ACK
        4)主设备等待读取一个字节数据
        5)主设备产生ACK
        ...
        n)主设备读取最后一个字节数据
        n+1)主设备不产生ACK
        n+2)主设备产生结束信号

二.I²C接口设备之E²PROM

    1.简单了解E²PROM
    E²PROM : 也叫做EEPROM,电可擦除可编程的只读存储器
    作用 : 是一种存储类的设备
    特点 : 存储到E²PROM中的数据,设备掉电之后,数据不会丢失
    注意 : E²PROM并不是硬盘
    应用 : 使用E²PROM存储特殊的数据
    (门禁打卡设备、测量设备、仪器仪表、用来存储BIOS或者BootLoader)
    
    2.ROM的发展历史
    ROM 只读存储器 特点是内部存储的数据只能读取,不能写入或者修改
    PROM 可编程的只读存储器 特点是内部存储的数据可以通过编程方法修改一次
    EPROM 可擦除可编程的只读存储器 特点是内部存储的数据可以修改多次
                    修改方法有限制
                    需要通过紫外线照射存储介质
    EEPROM 电可擦除可编程的只读存储器 特点是内部存储的数据可以修改多次
                    通过电信号即可清除数据
    3.通过手册了解E²PROM
    打开<STM32RBT6\DataSheet\其他>目录下
    <AT24C02_ATMEL Corporation.pdf>
    1)我们的开发板上使用的E²PROM是阿特梅尔公司的模块
    2)使用的是8管脚的封装形式
    (A0 A1 A2<设备地址> GND<接地> SDA<数据线> SCL<时钟线>)
    (WP(写保护) VCC<接电源>)
    3)使用的是I²C接口的E²PROM
    4)规格
    型号	规格	存储大小		Page
    AT24C01	1K	128byte		16个Page
    AT24C02	2K	256byte		32个Page
    AT24C04	4K	512byte		32个Page
    AT24C08	8K	1024byte		64个Page
    AT24C16	16K	2048byte		128个Page

eeprom

    5)任何规格的E²PROM的设备地址的高四位都是固定的了1010
        1K/2K规格可以通过A2 A1 A0管脚选择设备地址
        4K规格可以通过A2 A1管脚选择设备地址
        8K规格可以通过A2管脚选择设备地址
        16K规格没有管脚可以选择设备地址
    6)通过开发板原理图的解析可以了解
        我们开发板上的E²PROM的设备地址是
        10100000(写操作的设备地址)0xA0
        10100001(读操作的设备地址)0xA1
    7)写操作
        1>按字节来写
            a>产生开始信号
            b>发送设备地址 + 写的标志(10100000<0xA0>)
            c>等待ACK
            d>发送内部存储空间的地址(0x00 - 0xFF)
            e>等待ACK
            f>发送一个字节数据
            g>等待ACK
            h>产生结束信号
        2>按页来写(注意:有页内回滚)
            a>产生开始信号
            b>发送设备地址 + 写的标志(10100000<0xA0>)
            c>等待ACK
            d>发送内部存储空间的地址(0x00 - 0xFF)
            e>等待ACK
            f>发送一个字节数据
            g>等待ACK
            ...
            n>发送最后一个字节数据
            n+1>等待ACK
            n+2>产生结束信号

页内回滚

    8)读操作
        1>当前地址读
            a>产生开始信号
            b>发送设备地址 + 读的标志(10100001<0xA1>)
            c>等待ACK
            d>读取一个字节数据
            e>不产生ACK
            f>产生结束信号
        2>随机地址读
            a>产生开始信号
            b>发送设备地址 + 写的标志(10100000<0xA0>)
            c>等待ACK
            d>发送内部存储空间的地址
            e>等待ACK
            f>产生开始信号
            g>发送设备地址 + 读的标志(10100001<0xA1>)
            h>等待ACK
            i>读取一个字节数据
            j>不产生ACK
            k>产生结束信号
        3>顺序读(整个存储空间的回滚)
            可以直接拼接到当前地址读或者随机地址读的后面

三.使用GPIO模拟I²C的协议的程序->驱动E²PROM