• stm8的IIC库的使用


    一.前言

           stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势。也同时具有价格便宜,低功耗的特点。在一些项目中,能起到很好的作用。下面我介绍一下stm8的IIC硬件库函数驱动代码及实现。

    二.IIC基本操作

           iic基本操作分为读操作和写操作,这两个操作就可以对设备进行一些基本的操作了。还要知道设备的地址就ok了,具体的IIC时序大家可以上网看看。

    三.实现代码

       1.先要启动IIC的时钟,保证可以正常工作。 CLK_PeripheralClockConfig (CLK_Peripheral_I2C1,ENABLE);//开启IIC1时钟

       2.再对IIC进行初始化的操作

            void Init(void)

          {

            I2C_DeInit(I2C1);
           I2C_Init(I2C1,IICSPEED, host_address, I2C_Mode_I2C,I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
           I2C_Cmd(I2C1,ENABLE);
          }

         可以用来对IIC的通信时间和主机地址以及从机地址等参数进行设置。IICSPEED最好不要超过400K,会造成通信的不稳定,最好在100K左右就可以了,host_address是主机的地址,可以自己设定。

      3.IIC的写操作

        

    /****************************************************************************
    * 名称:I2C_WriteByte(uint8_t addr,uint8_t data)
    * 功能:进行IIC的写操作。
    * 入口参数: uint8_t addr 寄存器的地址
    * uint8_t data 写入的数据
    * 出口参数:无
    * 说明:对触摸屏的寄存器进行写入操作,变量都是16进制
    ****************************************************************************/

    void I2C_WriteByte(uint8_t addr,uint8_t data)
    {

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //等待空闲

    I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

    I2C_Send7bitAddress(I2C1, I2C1_WRITE_ADDRESS7, I2C_Direction_Transmitter);//器件地址 -- 默认0xD0
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C_SendData(I2C1, addr);//寄存器地址
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    I2C_SendData(I2C1, data);//发送数据
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    I2C_AcknowledgeConfig(I2C1,ENABLE);

    I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线
    }

    上面的代码是IIC的写函数,可以对设备的寄存器进行写操作。I2C1_WRITE_ADDRESS7代表设备IIC的写入地址,根据器件地址的不同改变就可以。每一步都是调用的IIC的库函数,如果进行单步调试,地址寄存器都对的话,就可以看见每操作一步从机都会有一个应答信号。

    4.IIC的读操作

    /****************************************************************************
    * 名称:uint8_t I2C_ReadByte(uint8_t addr)
    * 功能:进行IIC的读操作。
    * 入口参数: uint8_t addr 寄存器的地址
    * 出口参数: uint8_t i 保存读到的数据并作为参数返回
    * 说明:对触摸屏的寄存器进行读出操作,变量都是16进制,IIC写操作要
    先写寄存器再进行读寄存器的操作,否则会失败
    ****************************************************************************/
    uint8_t I2C_ReadByte(uint8_t addr)
    {
    uint8_t i;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

    I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

    I2C_Send7bitAddress(I2C1, I2C1_WRITE_ADDRESS7, I2C_Direction_Transmitter);//器件地址 -- 默认0xD0
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

    I2C_SendData(I2C1, addr);//寄存器地址
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));



    I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

    I2C_Send7bitAddress(I2C1, I2C1_READ_ADDRESS7, I2C_Direction_Receiver);//器件地址 -- 默认0xD1
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


    while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));

    i=I2C_ReceiveData(I2C1);//读取数据

    I2C_AcknowledgeConfig(I2C1,DISABLE);

    I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线


    return i;

    }

    IIC的读操作,跟写操作不同的是.读操作首先要先进行写操作,写一下要读的寄存器地址,当然地址也要发送写入的地址。然后再写入器件读取地址,要读取的寄存器地址,把数据读取出来。I2C1_READ_ADDRESS7为器件的读取地址,写操作和读操作两个操作的应答变量也不一样,这个要注意一下。

    四.总结

    硬件IIC的库函数实现通信,代码实现量小,调通以后的稳定性高,速度快。缺点是可能会占一部分内存空间,调试不方便,因为都是用的库函数,不容易找问题。

  • 相关阅读:
    51nod 237 最大公约数之和 V3 杜教筛
    luogu P4213 【模板】杜教筛(Sum)
    BZOJ 3527: [Zjoi2014]力 FFT
    凸多边形 HRBUST
    luogu P1354 房间最短路问题 计算几何_Floyd_线段交
    几何基础
    BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 Hash + Splay
    BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组
    BZOJ 2820: YY的GCD 莫比乌斯反演 + 数学推导 + 线性筛
    迭代器,三元表达式,列表生成式,字典生成式,生成器,递归(没深入理解)
  • 原文地址:https://www.cnblogs.com/sjsxk/p/5951806.html
Copyright © 2020-2023  润新知