首页 > 其他分享 >iic学习笔记

iic学习笔记

时间:2023-12-24 16:45:15浏览次数:31  
标签:StatusTypeDef scl HAL 笔记 学习 sda iic GPIO

一、简介

由飞利浦主导开发的片间互联协议。iic通信使用三线(sda scl以及gnd,不包括电源线),极大程度上减少了对ic的io口的占用。同时iic支持多主机以及多从机,方便了程序的设计。

二、协议层简介

在iic总线上scl的电平决定了整条iic总线的有效性。
当scl出于高电平时,主机与从机可以侦测sda数据的变化,sda上的数据有效。当scl出于低电平时sda线无效,目标准备读取下一位数据。
在iic总线上,一共有四种状态:起始,0/应答,1/非应答,结束 在scl线处于高电平的状态下,这四种状态对应的sda的状态分别是: 起始: sda产生下降沿 0/ack: sda处于低电平 1/nack:sda处于高电平 结束: sda产生上升沿 同时,在iic总线启动后以及一轮通信结束后,需要将scl置1,便于其他设备快速发起以及响应iic请求。而在通信中,scl要在读取前与读取后及时置0,便于目标设备读取下一位数据。
image image
iic帧格式
首先是起始信号,通知各设备开始传输。随后是1byte的目标设备的地址(准确的说,是7位地址加上一个读写控制位)。然后由目标设备给出ack。在主机收到ack后,可进行对应数据的读取。在数据传输部分,根据iic协议规定,每次只允许连续传输1byte,也即随后需要有一方及时给出ack,否则将超时终止传输(包括nack)。所有数据传输完毕后,主机设置结束信号。
在一次通信中,如果需要转变读写状态,需要主机重新发送起始信号、目标地址与读写状态。
image

三、参考实现:

基于stm32f103c6t6 HAL编写
iic.c

#include "iic.h"

//private functions 
void sda(uint8_t sta) {
    HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, sta ? GPIO_PIN_SET : GPIO_PIN_RESET);
    for (int i = 0;i < 100;i++);//delay

}

void scl(uint8_t sta) {
    HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, sta ? GPIO_PIN_SET : GPIO_PIN_RESET);
    for (int i = 0;i < 100;i++);
}

void signal(uint8_t sig) {
    sda(sig);
    scl(0);
    scl(1);
    scl(0);
}


//public functions
HAL_StatusTypeDef iic_st(void) {
    sda(1);//startup
    scl(1);
    sda(0);
    scl(0);
    return HAL_OK;
}

HAL_StatusTypeDef iic_ed(void) {
    scl(0);//end
    sda(0);
    scl(1);
    sda(1);
    return HAL_OK;
}

HAL_StatusTypeDef iic_tx(uint8_t data) {


    for (int i = 0;i < 8;i++) {
        signal(data >> 7);
        data <<= 1;
    }


    return HAL_OK;
}

HAL_StatusTypeDef iic_rx(GPIO_PinState* pdata) {
    uint8_t pin_sta = 0, data = 0;
    
    data = 0;
    scl(0);
    sda(1);
    
    for (int i = 7;i >= 0;i--) {
        scl(1);
        pin_sta = HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin);
        data += pin_sta<<i;
        scl(0);
    }
    *pdata = data;

    return HAL_OK;
}

HAL_StatusTypeDef iic_wait_ack(void) {
    uint8_t t = 0xff;
    
    scl(0);
    sda(1);
    scl(1);
    while (t--) {
        if (HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin) == GPIO_PIN_RESET) {
            scl(0);
            return HAL_OK;
        }
    }
    iic_ed();
    return HAL_TIMEOUT;
}

HAL_StatusTypeDef iic_send_ack(uint8_t ack) {
    signal(ack);
    return HAL_OK;
}

 

iic.h

#ifndef __IIC_H__
#define __IIC_H__

#include "stm32f1xx_hal.h"

#define SDA_Pin GPIO_PIN_8
#define SDA_GPIO_Port GPIOB
#define SCL_Pin GPIO_PIN_9
#define SCL_GPIO_Port GPIOB

HAL_StatusTypeDef iic_st(void);
HAL_StatusTypeDef iic_ed(void);
HAL_StatusTypeDef iic_tx(uint8_t data);
HAL_StatusTypeDef iic_rx(uint8_t* data);
HAL_StatusTypeDef iic_wait_ack(void);
HAL_StatusTypeDef iic_send_ack(uint8_t ack) ;

#endif

 

标签:StatusTypeDef,scl,HAL,笔记,学习,sda,iic,GPIO
From: https://www.cnblogs.com/lvxylvxy/p/17924440.html

相关文章

  • FWT 学习笔记
    解决的问题\(\rmFWT\)是用来解决位运算卷积的。啥是位运算卷积呢?常见的多项式乘法可以认为是一种加法卷积,即\(A_{i+j}=\sumB_i\timesC_j\)。位运算卷积就是\(A_{i\\text{Or/And/Xor}\j}=\sumB_i\timesC_j\)。主要思想现在以异或卷积为例,默认\(n=2^k\)。回忆......
  • 2023-2024-1 学号20231310《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标自学教材《C语言程序设计》第12章并完成云班课测试作业正文2023-2024-120231310《计算机基础与程序设计》第十三......
  • 2023-2024-1 20231420 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231420《计算机基础与程序设计》第十三周学习总结1.作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标学习《C语言程序设计》第12章并完成云班课测......
  • Microsoft Azure AI 机器学习笔记-1
    机器学习基础:数据与建模:数据统计和数学建模是处理数据和描述现实情况的关键工具。观测值是记录的数据实例,而特征是描述观测对象的属性。标签则代表监督式学习中的已知输出值。学习类型:监督式学习包括回归(预测数值标签)和分类(预测类别标签),其中分类又分为二元分类和多类......
  • 微信小程序开发学习日志
    文件夹:pages:index:首页logs:日志json配置文件:app.json:app.json为全局配置,包括了所有页面路径(pages)、窗口外观(window)、界面表现(style)、底部tab等。#页面配置会覆盖全局配置project.config.json:"setting": 本地设置"es6": JS编译成ES5是否开启"postcss": 上传代码时样......
  • 强化学习算法真的适合于你的应用吗 —— 强化学习研究方向(研究领域)现有的不足(短板、
    外文原文:WhyYou(Probably)Shouldn’tUseReinforcementLearning地址:https://towardsdatascience.com/why-you-shouldnt-use-reinforcement-learning-163bae193da8中文翻译版本(ChatGPT3.5翻译:)有关这项技术存在很大的炒作,而且理由充分,因为这可能是实现通用人工智能的......
  • 2023-2024-1 20211319《计算机基础与程序设计》第十三周学习总结
    2023-2024-120211319《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标<写上具体方面>作业正......
  • 微信小程序开发笔记[6]-蓝牙ble扫描设备
    摘要使用微信小程序扫描BLE设备,找到指定设备后弹窗.平台信息微信开发者工具Stable1.06.2310080原理typescript+less开发模式[https://developers.weixin.qq.com/miniprogram/dev/devtools/compilets.html][https://blog.csdn.net/Boale_H/article/details/121360082]......
  • # 2023-2024-1 20231308 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231308《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标自学教材《C语言程序设计》第12章并完成云班课测试......
  • exgcd 学习笔记
    定义又名扩展欧几里得算法(辗转相除法)是用来求\(ax+by=gcd(a,b)\)中未知数的算法算法证明拿到一组\(a,b\),设\(G=gcd(a,b)\)目标:求出满足\(ax+by=G(1)\)的\(x\)与\(y\)如果已知一组\(x2,y2\),满足\(bx2+\)\((a\)\(mod\)\(b)y2=G(2)\)此时结合\((1)(2)\)得\(a......