IIC模拟协议华大单片机移植

本文所用为 HC32L136K8TA
使用Gpio10== SDA GpioC11==SCL
先把关键性 宏定义说明

//引脚声明
#define SCL_PORT   GpioPortC
#define SCL_PIN    GpioPin11#define SDA_PORT   GpioPortC
#define SDA_PIN    GpioPin10//IO方向设置
#define PC1out(n)   Gpio_WriteOutputIO( GpioPortC,  n, 1)  //输出
#define PC0out(n)   Gpio_WriteOutputIO( GpioPortC,  n, 0)  //输出
#define PCin(n)     Gpio_GetInputIO(GpioPortC,n)  //输入      //IO操作函数    置地
#define MPU_IIC_SCL_0    PC0out(GpioPin11) //SCL
#define MPU_IIC_SDA_0    PC0out(GpioPin10) //SDA
//IO操作函数     拉高
#define MPU_IIC_SCL_1     PC1out(GpioPin11) //SCL
#define MPU_IIC_SDA_1     PC1out(GpioPin10) //SDA
//IO读
#define MPU_READ_SDA     PCin(10)  //输入SDA //IIC所有操作函数
void MPU_IIC_Delay(void);               //MPU IIC延时函数
void MPU_IIC_Init(void);                //初始化IIC的IO口
void MPU_IIC_Start(void);               //发送IIC开始信号
void MPU_IIC_Stop(void);                //发送IIC停止信号
void MPU_IIC_Send_Byte(uint8_t txd);            //IIC发送一个字节
uint8_t MPU_IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
uint8_t MPU_IIC_Wait_Ack(void);                 //IIC等待ACK信号
void MPU_IIC_Ack(void);                 //IIC发送ACK信号
void MPU_IIC_NAck(void);                //IIC不发送ACK信号void IMPU_IC_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
uint8_t MPU_IIC_Read_One_Byte(uint8_t daddr,uint8_t addr);

先初始化SCL SDA 引脚

//初始化IIC
void MPU_IIC_Init(void)
{                        stc_gpio_cfg_t stcGpioCfg;///< 打开GPIO外设时钟门控Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);///< 端口方向配置->输入stcGpioCfg.enDir = GpioDirOut;stcGpioCfg.enPu = GpioPuEnable;stcGpioCfg.enPd = GpioPdDisable; Gpio_Init(SDA_PORT, SDA_PIN, &stcGpioCfg);///< 端口方向配置->输出stcGpioCfg.enDir = GpioDirOut;stcGpioCfg.enPu = GpioPuEnable;stcGpioCfg.enPd = GpioPdDisable;     Gpio_Init(SCL_PORT, SCL_PIN, &stcGpioCfg);IIC_SET_SDA;IIC_SET_SCL;
}

延时函数

  //MPU IIC 延时函数
void MPU_IIC_Delay(void)
{__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();           __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}

IIC起始信号 停止信号

//产生IIC起始信号 停止信号
void MPU_IIC_Start(void)
{MPU_SDA_OUT();     //sda线输出MPU_IIC_SDA_1;        MPU_IIC_SCL_1;MPU_IIC_Delay();MPU_IIC_SDA_0;//START:when CLK is high,DATA change form high to low MPU_IIC_Delay();MPU_IIC_SCL_0;//钳住I2C总线,准备发送或接收数据 MPU_IIC_Delay();
}
//产生IIC停止信号
void MPU_IIC_Stop(void)
{MPU_SDA_OUT();//sda线输出MPU_IIC_SCL_0;MPU_IIC_SDA_0;//STOP:when CLK is high DATA change form low to highMPU_IIC_Delay();MPU_IIC_SCL_1;  MPU_IIC_SDA_1;//发送I2C总线结束信号MPU_IIC_Delay();
}

主动应答和非应答

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
uint8_t MPU_IIC_Wait_Ack(void)
{uint8_t ucErrTime=0;MPU_SDA_IN();      //SDA设置为输入  MPU_IIC_SDA_1;MPU_IIC_Delay();    MPU_IIC_SCL_1;MPU_IIC_Delay();    while(MPU_READ_SDA){ucErrTime++;if(ucErrTime>250){MPU_IIC_Stop();return 1;}}MPU_IIC_SCL_0;//时钟输出0        return 0;
}
//产生ACK应答
void MPU_IIC_Ack(void)
{MPU_IIC_SCL_0;MPU_SDA_OUT();MPU_IIC_SDA_0;MPU_IIC_Delay();MPU_IIC_SCL_1;MPU_IIC_Delay();MPU_IIC_SCL_0;
}
//不产生ACK应答
void MPU_IIC_NAck(void)
{MPU_IIC_SCL_0;MPU_SDA_OUT();MPU_IIC_SDA_1;MPU_IIC_Delay();MPU_IIC_SCL_1;MPU_IIC_Delay();MPU_IIC_SCL_0;
}

发送一个字节 读取一个字节

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void MPU_IIC_Send_Byte(uint8_t txd)
{                        uint8_t t;   MPU_SDA_OUT();        MPU_IIC_SDA_0;MPU_IIC_Delay(); for(t=0;t<8;t++){              if((txd&0x80)>>7)MPU_IIC_SDA_1;elseMPU_IIC_SDA_0;txd<<=1;MPU_IIC_Delay();  MPU_IIC_SCL_1;MPU_IIC_Delay();MPU_IIC_SCL_0;    MPU_IIC_Delay();}    MPU_IIC_SCL_0; MPU_IIC_Delay();
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t MPU_IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;MPU_SDA_IN();//SDA设置为输入MPU_IIC_Delay();for(i=0;i<8;i++ ){receive<<=1;MPU_IIC_SCL_1;MPU_IIC_Delay();if(READ_SDA)receive|=0x01;MPU_IIC_SCL_0; MPU_IIC_Delay(); }                     if (!ack)MPU_IIC_NAck();//发送nACKelseMPU_IIC_Ack(); //发送ACK   return receive;
}

IIC模拟协议华大单片机移植相关推荐

  1. 华大单片机移植TencentOS

    华大单片机移植TencentOS-Tiny 文章目录 华大单片机移植TencentOS-Tiny 一.参考链接: 二.资料准备 三.开始移植 四.移植完成-测试 五.总结 一.参考链接: 1.Tiny ...

  2. 华大单片机移植RTThread操作系统

    华大单片机移植RTThread-国产操作系统 文章目录 华大单片机移植RTThread-国产操作系统 1.华大单片机型号选择 2.RTThread源码下载 2.1 .资料说明 2.3.源码下载 3.移 ...

  3. 华大单片机HC32L130/HC32L136从机IIC通信

    从机IIC理论知识 主机IIC的做法比较多,从机IIC的就相对比较难一点. 先补充一下从机IIC的思路: 先看IIC时序图,然后根据时序图理清IIC从机需要做哪些判断: 从机发送: ·判断IIC ST ...

  4. 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

    一.项目介绍 当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备.设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来:可以广泛应用于室 ...

  5. STM32 第19讲 IIC(协议简介/读取驱动AT24C02/实验)

    文章目录 IIC总线协议介绍 IIC总线结构图 IIC协议 IIC读写通讯过程 24C02 简介 24C02读写时序图 写时序图 读时序 实验 实现功能 实验原理 流程图 代码 IIC底层驱动代码 2 ...

  6. ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议

    IIC通讯协议 协议简介 IIC(inter-integrated Circuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换,它是由 ...

  7. 华大单片机 HC32F460 驱动BM8563ESA RTC芯片

    前言 因华大单片机没有单独VBAT管脚,无法使用,如果用单片机自带的RTC模块,系统断电后时间无法准确,需要重新设置,影响用户体验,说以系统加入单独的RTC芯片. RTC时钟电路 单片机管脚定义 RT ...

  8. 如何从一款单片机移植到另一款单片机

    如何从一款单片机移植到另一款单片机 目录 如何从一款单片机移植到另一款单片机 前言 1 硬件移植 2 软件移植 2.1 移植原因 2.2 移植原理 2.3 固件库之间的移植方法 2.3 非固件库之间的 ...

  9. 华大单片机HC32L136J8TA读取DS18B20温度(源码+时钟配置)

    免费的C语言和linuxPDF文档:传送门 有一点C语言基础和华大单片机开发经验,应该就能看得懂就不多介绍了,有疑问可以留言,看到就回了; 关于协议具体解析:传送门@不脱发的程序猿 注(2021-05 ...

最新文章

  1. 织梦dedecms实现按照字母搜索的实现方法
  2. linux 路由表设置 之 route 指令详解
  3. 【渝粤题库】国家开放大学2021春2224物业管理法规题目
  4. C++ STL 线性容器的用法
  5. English trip -- VC(情景课)5 Around Town
  6. 三大开源生信基础教程和视频课程
  7. HTML+CSS物业后台管理系统模板
  8. 如何给Xcode添加我们常用的插件呢?
  9. kafka消息堆积原因解析
  10. 吾爱破解“凉”了之后,还能去哪儿下载软件?
  11. Python数据分析-房价的影响因素图解
  12. Joomla 插件 attachments 使用时出现不支持ZIP文件上传的错误
  13. PDI-KETTLE-4 使用Kettle完成通用DB数据获取生成指定分隔符的文件并通过FTP上传的功能...
  14. linux下为php添加GD库(重新编译php)
  15. 两个苹果手机怎么定位_苹果手机很卡怎么办
  16. pandas分组分析:GroupBy和pandas交叉分析:pivot_table/crosstab【学习记录】
  17. 计算机视觉(北邮鲁鹏)--卷积
  18. 中国成全球最大工业机器人市场 年增长速度25%
  19. 安卓游戏应用如何在linux上流畅运行
  20. C++ Reference: Standard C++ Library reference: C Library: cstdio: vsnprintf

热门文章

  1. 分区软件如何将动态盘转换成基本盘?
  2. 双十一来袭,想要掌控售卖数据,为何不试试智慧商场可视化系统?
  3. 服务器系统兼容性问题,微软表示因兼容性问题,部分用户无法升到Windows10最新版本...
  4. postgre 笔记
  5. 计算机控制点火系统如何控制点火提前角,电子点火系统如何控制点火提前角?...
  6. 【独家】彩虹代shua最新6.6版本/免授权/后台同步官方版本升级
  7. 【win10】使用Python 3.7 py2neo连接Neo4j
  8. 子墨对酒《三国杀》里论模式(二)门面模式
  9. LeetCode: 868. Transpose Matrix
  10. 5.2.3案例小猪称体重