首页 > 其他分享 >STM32F103系列IIC通讯代码

STM32F103系列IIC通讯代码

时间:2024-04-02 14:00:26浏览次数:19  
标签:STM32F103 通讯 void SDA IIC InitStruct GPIO Delayus

CH1--SDA;

CH2--SCL。

 

#include "iic.h"
void IIC_GPIO_Init(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA1 - SCL
    

    GPIO_Init(GPIOA, &GPIO_InitStruct);//SCL会被拉低

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA0 - SDA SDA会被拉低

    GPIO_Init(GPIOA, &GPIO_InitStruct);

    

    
}
void IIC_SDA_OUT(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;

    

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA0 - SDA

    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void IIC_SDA_IN(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;

    GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void IIC_Init(void)
{
    IIC_SCL_H;
    IIC_SDA_H;
}

void IIC_Start(void)
{
     
     IIC_SDA_H;
     Delayus(5);
     IIC_SCL_H;
     Delayus(6);
     IIC_SDA_L;
     Delayus(5);
     IIC_SCL_L;
     Delayus(5);


}

void IIC_Stop(void)
{
     
     IIC_SDA_L;
     Delayus(5);
     IIC_SCL_H;
     
     Delayus(6);
     IIC_SDA_H;
     Delayus(5);
    
}

void IIC_Ack(void)
{
    IIC_SDA_IN();
    Delayus(5);
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
    {
        IIC_SDA_OUT();
        IIC_SDA_L;
        
    }
    else
    {
        IIC_SDA_OUT();
        IIC_SDA_H;
    }
    IIC_SCL_H;
    Delayus(5);


    IIC_SCL_L;
    Delayus(5);
}


void IIC_NoAck(void)
{
    Delayus(6);
    

    IIC_SDA_H;

    Delayus(5);

    IIC_SCL_L;
    Delayus(5);
    IIC_SDA_L;

    Delayus(5);
}



void IIC_Write(uint8_t byte)
{
    uint8_t i;

    Delayus(5);
    for(i = 0; i < 8; i ++)
    {
        
        if((byte&0x80) == 0x80)
        {
            IIC_SDA_H;
        }
        else
        {
            IIC_SDA_L;
        }
        byte = byte << 1;

        Delayus(5);
        IIC_SCL_H;
        Delayus(5);
        IIC_SCL_L;
        Delayus(5);


    }
    IIC_SDA_L;
    IIC_SCL_L;
    
}

uint8_t IIC_Read(void)
{
    uint8_t i = 0,val = 0;
    IIC_SDA_IN();

    for(i = 0; i < 8; i ++)
    {
        
        IIC_SCL_L;
        
        Delayus(5);
        val = (val << 1);
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
        {
            val |= 0x01;
        }
        else
        {
            val |= 0x00;
        }
        

        Delayus(5);
        IIC_SCL_H;
        Delayus(5);

    }
    IIC_SCL_L;
    Delayus(5);
    

    
    IIC_SDA_OUT();

    return val;
}

void IIC_WriteByte(uint8_t addr, uint8_t data)
{
//    IIC_Init();
    IIC_Start();
    IIC_Write(0xae);
    IIC_Ack();
    IIC_Write(addr);
    IIC_Ack();
    IIC_Write(data);
    IIC_Ack();
    IIC_Stop();
}

uint8_t IIC_ReadByte(uint8_t addr)
{
    uint8_t val = 0;
    IIC_Start();
    IIC_Write(0xae);
    IIC_Ack();
    IIC_Write(addr);
    IIC_Ack();


    IIC_Start();
    IIC_Write(0xaf);
    IIC_Ack();
    val = IIC_Read();
    IIC_NoAck();
    IIC_Stop();

    return val;
}
#include "stm32f10x.h"

#include "delay.h"
#include "iic.h"
#include "led.h"

uint8_t Value = 0;

int main(void)
{
    
    Delay_Init();
    IIC_GPIO_Init();
    LED_GPIO_Init();
    
    IIC_WriteByte(0x01, 0xF5);
    Delayus(500000);
    Delayus(500000);

    Value = IIC_ReadByte(0x01);
    Delayus(500000);
    while(1)
    {
        if(Value == 0xF5)LED_Test();
        else
        {
              LED(ON);
        }
    }
    
}

 

标签:STM32F103,通讯,void,SDA,IIC,InitStruct,GPIO,Delayus
From: https://www.cnblogs.com/chillytao-suiyuan/p/18110429

相关文章

  • C#中的通讯协议
    通信协议在C#和WPF日常开发中扮演着至关重要的角色,它们用于实现不同设备或系统之间的数据交换和通信。以下是关于通信协议的知识点,以及可能会在面试中被问到的一些问题和答案:通信协议的知识点:TCP/IP协议:TCP/IP协议是一种面向连接的、可靠的网络通信协议,用于在网络中传......
  • 拟MobusRTU组网通讯可能用到的各阶段时间开销分析
    1、用PLC读取智能电表的数据,西门子modbustcp是一种工业现场总线协议标准,周期时间为150ms。对某一IO的扫描周期可以指定配置到us级!(可以根据这个对单个点位的失压变化进行捕捉)具体可以用电压感应线圈。当电压有波动时,立刻对外输出一个信号。此信号立刻被PLC捕捉到。2、正常Modbus......
  • .net和java串口通讯压力测试对比
    最近由于工作要求,需要对一个串口通讯设备进行压力测试,要求连续持续对串口设备发送指令,无间隔,测试设备是否会死机。要求做到毫秒级,测试第三方的工具,基本上都无法达到毫秒级,最少的也是10毫秒。于是就自己写代码测试。通过.net写,发现最少能达到1毫秒,但是有遗漏,看日志如下2024-03-3......
  • Android studio制作的mqtt协议通讯app,可用于搭建的meqx服务器,不可连接阿里云
    首先,在app目录下创建一个libs文件夹,导入相应的MQTT的jar包,然后右击jar包拉到最后找到Add...的一个选项,单击就OK了然后就是添加一些权限添加另一个layout的名字activity_main<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.......
  • 基于Android的IM即时通讯聊天系统应用设计与实现(论文+源码+讲解视频)
    安卓AndroidStudio聊天app源码带java后台Nettymybatis框架数据库mysql,非常适合学习使用。基于Netty实现IM即时通讯开发120分钟代码讲解视频包含项目报告,接近22000字数文档(绪论、项目相关技术、项目需求分析、项目系统设计、数据库设计、系统功能实现、系统测试、结论及参......
  • 结构体应用--通讯录
    在上一篇文章中我们详细讲解了自定义类型,这篇文章我们就使用结构体实现一个简单的通讯录。数据的存储通讯录要存储每个联系人的信息,每个联系人的信息又由姓名,年龄,性别,电话,地址这五个因素组成,所以我们首先要创建一个结构体类型来保存每个联系人的信息。我们在头文件中声明一......
  • Windows中的MSG命令是一种用于向其他用户或会话发送消息的命令行工具。它可以用于在本
    Windows中的MSG命令是一种用于向其他用户或会话发送消息的命令行工具。它可以用于在本地网络上向其他用户或会话发送即时通讯,以便进行通知、提醒或交流。MSG命令的作用:发送消息: MSG命令允许管理员或用户向其他用户或会话发送简短的消息。通知和提醒: 可以用MSG命令来发送提醒......
  • UDP服务器广播+实现跨网段通讯
    UDP协议简介:        UDP为应用程序提供了一种无需建立连接就可以发送封装的IP数据包的方法;由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。UDP与TCP协议一样使用"IP地址+端口号"区分主机不同......
  • Modbus通讯协议中的四种字节顺序
    国内设备基本上是ABCD顺序,国外设备基本上是BADC顺序。低位优先字节交换。使用两个寄存器。使用IEEE754规范,如显示不正常可进行字节顺序交换位置即可。如下:FloatBig-endian字节顺序:ABCDFloatLittle-endian字节顺序:DCBAFloatBig-endianbyteswap......
  • stm32f103c8t6学习笔记(学习B站up江科大自化协)-DMA
    DMA简介    ·DMA主要用于协助CPU完成数据转运的工作    ·DMA,英文全称DirectMemoryAccess,DMA这个外设是可以直接访问STM32内部存储器的,包括运行内存SRAM,程序存储器flash和寄存器等等,DMA都有权限访问,所以DMA能完成数据转运的工作    ·第二行的外......