IIC模拟协议华大单片机移植
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模拟协议华大单片机移植相关推荐
- 华大单片机移植TencentOS
华大单片机移植TencentOS-Tiny 文章目录 华大单片机移植TencentOS-Tiny 一.参考链接: 二.资料准备 三.开始移植 四.移植完成-测试 五.总结 一.参考链接: 1.Tiny ...
- 华大单片机移植RTThread操作系统
华大单片机移植RTThread-国产操作系统 文章目录 华大单片机移植RTThread-国产操作系统 1.华大单片机型号选择 2.RTThread源码下载 2.1 .资料说明 2.3.源码下载 3.移 ...
- 华大单片机HC32L130/HC32L136从机IIC通信
从机IIC理论知识 主机IIC的做法比较多,从机IIC的就相对比较难一点. 先补充一下从机IIC的思路: 先看IIC时序图,然后根据时序图理清IIC从机需要做哪些判断: 从机发送: ·判断IIC ST ...
- 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)
一.项目介绍 当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备.设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来:可以广泛应用于室 ...
- STM32 第19讲 IIC(协议简介/读取驱动AT24C02/实验)
文章目录 IIC总线协议介绍 IIC总线结构图 IIC协议 IIC读写通讯过程 24C02 简介 24C02读写时序图 写时序图 读时序 实验 实现功能 实验原理 流程图 代码 IIC底层驱动代码 2 ...
- ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议
IIC通讯协议 协议简介 IIC(inter-integrated Circuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换,它是由 ...
- 华大单片机 HC32F460 驱动BM8563ESA RTC芯片
前言 因华大单片机没有单独VBAT管脚,无法使用,如果用单片机自带的RTC模块,系统断电后时间无法准确,需要重新设置,影响用户体验,说以系统加入单独的RTC芯片. RTC时钟电路 单片机管脚定义 RT ...
- 如何从一款单片机移植到另一款单片机
如何从一款单片机移植到另一款单片机 目录 如何从一款单片机移植到另一款单片机 前言 1 硬件移植 2 软件移植 2.1 移植原因 2.2 移植原理 2.3 固件库之间的移植方法 2.3 非固件库之间的 ...
- 华大单片机HC32L136J8TA读取DS18B20温度(源码+时钟配置)
免费的C语言和linuxPDF文档:传送门 有一点C语言基础和华大单片机开发经验,应该就能看得懂就不多介绍了,有疑问可以留言,看到就回了; 关于协议具体解析:传送门@不脱发的程序猿 注(2021-05 ...
最新文章
- 织梦dedecms实现按照字母搜索的实现方法
- linux 路由表设置 之 route 指令详解
- 【渝粤题库】国家开放大学2021春2224物业管理法规题目
- C++ STL 线性容器的用法
- English trip -- VC(情景课)5 Around Town
- 三大开源生信基础教程和视频课程
- HTML+CSS物业后台管理系统模板
- 如何给Xcode添加我们常用的插件呢?
- kafka消息堆积原因解析
- 吾爱破解“凉”了之后,还能去哪儿下载软件?
- Python数据分析-房价的影响因素图解
- Joomla 插件 attachments 使用时出现不支持ZIP文件上传的错误
- PDI-KETTLE-4 使用Kettle完成通用DB数据获取生成指定分隔符的文件并通过FTP上传的功能...
- linux下为php添加GD库(重新编译php)
- 两个苹果手机怎么定位_苹果手机很卡怎么办
- pandas分组分析:GroupBy和pandas交叉分析:pivot_table/crosstab【学习记录】
- 计算机视觉(北邮鲁鹏)--卷积
- 中国成全球最大工业机器人市场 年增长速度25%
- 安卓游戏应用如何在linux上流畅运行
- C++ Reference: Standard C++ Library reference: C Library: cstdio: vsnprintf
热门文章
- 分区软件如何将动态盘转换成基本盘?
- 双十一来袭,想要掌控售卖数据,为何不试试智慧商场可视化系统?
- 服务器系统兼容性问题,微软表示因兼容性问题,部分用户无法升到Windows10最新版本...
- postgre 笔记
- 计算机控制点火系统如何控制点火提前角,电子点火系统如何控制点火提前角?...
- 【独家】彩虹代shua最新6.6版本/免授权/后台同步官方版本升级
- 【win10】使用Python 3.7 py2neo连接Neo4j
- 子墨对酒《三国杀》里论模式(二)门面模式
- LeetCode: 868. Transpose Matrix
- 5.2.3案例小猪称体重