以畅学三合一傻瓜板为例
IO管教 配置图
电路图:
此刻我们可以想到 IIC 协议中 SCL代表时钟, SDA代表数据。其中 主机模式 为 STM32F103C8T6 ,从机模式 为 AT24C02 。
可知 时钟有STM32提供, 即 SCL-PB2 必须为 输出模式,也只有输出模式一种。
而 SDA 数据是双向的,可以是 从机向主机发送 数据或应答(非)信号。 也可以是 主机向从机发送 数据或应答(非) 信号。
PS:解决一个相对性问题,对于 主机STM32来说,下面的思维都是按照 这个相对性来解释的。
主机向从机发送 数据或应答(非) 信号 是 写数据;
从机向主机发送 数据或应答(非) 信号 是 读数据。
如此而来, SDA--PB3 有两个方向,一个是输入,一个是输出两种模式。
一、看一下配置:
设置二者0、1 状态
下面配置PB2、3 (包含SCL-PB2 必须为输出模式,也只有输出模式一种)
分析为什么要功能复位时钟,并且 JTAG和SW全部失能??
用一大节的内容讲解:
1、为什么要开启复位时钟?
我们要使用复位功能,必然要打开这个复位时钟。使用复位功能是为了在调试期间可以使用更多GPIOs 口。
因为这里我们要使用PB3,关键问题是 JTAG和SW占用了PB3(图)
这些端口是否可用,如下图。
001、010、100 这3中配置分别对应了,IO口是否复用可用。
这样说明为什么要开启复位时钟了,就是为了要使用 PB3端口,否则不可用。
看一下电路图:
2、怎样使用端口重映射配置,复用情况有3种?
是通过上图配置的,每种配置的含义在之前已经说明。
这样初始化IIC就全部分析完了。
二、SDA--PB3 有两个方向,一个是输入,一个是输出两种模式。
先附几张简单流程图,看完想必一定有启发
下面简单介绍一下IIC 时序
1)起始信号和终止信号 (都是主机发送,所以都是输出模式)
2) 应答 与 非应答 (包括一个等待应答) (也是主机发送,所以输出模式)
主机应答与非应答
下面看一下 等待应答
(主机等待从机应答,所以这个应答是 从机发送给主机,那么SDA为输入模式)
3) 读写一个字节
写一个字节 (主机发送,所以SDA输出)
读1个字节 ,分为有应答 和 非应答 (是从机给主机发送,所以主机SDA设置为输入模式,完成后 是否有主机的应答)
下面看一下 AT24C02 收发过程
这样上面散装的胳膊、腿什么的都准备好了,下面开始组装。
初始化,不介绍。
读出一个数据
这里IIC_Send_Byte 和 IIC_Read_Byte 函数写的时候,都是按照 8 位数据来的,
所以当有类似 AT24c02 的 超过8位 数据的时候,要发送两次来确定地址。
写入一个数据
下面看一下别的读写一个数据:也是调用了上面函数
检查AT24CXX是否正常
这样AT24C02XX--IIC关系就讲解完了,这要在 main 函数中使用其相应的函数即可。
这给人的感觉就是一层一层封装的感觉,最后把接口留给用户,这样用户直接使用接口就能完成AT24CXX 存储器模块的读写。
同理 STM32的3.5库也是这种道理,我们是上层用户,我们知道接口后,直接调用STM32函数库; 而使用我们写好函数的用户是 上上层用户,直接调用AT24CXX_Write和AT24CXX_Read 就能完成操作。
如果用相对性理解的话,我们也算是底层开发,哈哈!!