GD32E230C8T6《调试篇》之 (软件) IIC通信(主机接收从机) + GN1650驱动芯片 + 按键 + 4位8段数码管显示 (成功)

GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)

  • IIC是什么
  • IIC简介
    • 1)IIC总线物理连接
    • 2)IIC时序协议
  • 按键扫描
  • 代码
    • 1)DIG2短按只++一次,长按超过1s 一直 ++;DIG3短按只 - - 一次,长按超过1s 一直 - -

IIC是什么

IIC也称I2C,是一个多主从的串行总线,由飞利浦公司发明的通讯总线,属于半双工同步传输类总线,仅由两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA,IIC总线要求每个设备SCL/SDA线都是漏极开路模式,因此必须带上拉电阻才能正常工作。I2C协议占用引脚少,硬件实现简单,可扩展性强,I2C数据传输速率有标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。

IIC简介

IIC总线的SDA和SCL两根总线需要上拉,使总线处于空闲状态。IIC总线一共有两种状态、四种信号。除此之外还需要了解IIC总线的数据有效性。

1)IIC总线物理连接

SDA 和SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时,这两条线路都是高电平。连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。
总线器件数目:由于每一个IIC器件在IIC总线上都有一个确切的7位地址码,这也意味着一条IIC总线上最多可链接127(0X00位地址不使用)个地址互不相同的IIC器件。但在单条IIC总线上链接不多与127个器件的同时,必须要满足总线电容不能超过400pF(协议规定),总线之所以规定电容大小是因为,IIC的OD要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。实际设计中经验值大概是8个器件左右。
在这里插入图片描述

2)IIC时序协议

时序图:
在这里插入图片描述
IIC总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为控制命令(START或STOP,也就是起始信号和停止信号)。
在这里插入图片描述
IDLE表示总线空闲状态。此状态下时钟信号SCL和数据信号SDL均为高电 平,此时无I2C设备工作。时钟线(SCL)和数据线(SDA)接上拉电阻,默认高电平,就是为了表示总线是空闲状态。
在这里插入图片描述

表示起始状态。在空闲状态下,时钟信号SCL继续保持高电平,数据信号SDL出现由高电平转换为低电平的下降沿,此时产生一个起始信号,与总线相连的I2C设备检测到起始信号之后,进入起始状态等待控制字节的输入。

在这里插入图片描述

I2C通信的停止信号由主设备发出,SCL保持高电平,SDA由低电平跳变到高电平。

在这里插入图片描述

应答信号接收端收到有效数据后需要向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。
在第9个时钟周期:
当SDA是低电平为有效应答(ACK),表示对方接收成功;
当SDA是高电平为无效应答(NACK),表示对方没有接收成功。
注意:数据发射端需要在第9个时钟周期等待接收端的应答信号

IIC协议的读写操作都是一字节大小,从高到低收发数据

在这里插入图片描述

在这里插入图片描述
————————————————
版权声明:本文为CSDN博主「烟雨江南、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guyuani/article/details/127709375

以上内容为转载!!! 下面是自己写的

按键扫描

GN1650 芯片有按键消抖,所以不需要软件消抖;

代码

1)DIG2短按只++一次,长按超过1s 一直 ++;DIG3短按只 - - 一次,长按超过1s 一直 - -


const uint8_t LEDENCODE[] = {0x03F,0x006,0x05B,0x04F,0x066,0x06D,0x07D,0x007,0x07F,0x06F};
//const LEDNUM[][3] = {{0x38,0x3F,0x3E,0x79},{},{}};#define READ_SDA gpio_input_bit_get(GPIOB,GPIO_PIN_7)
#define LEDDOT 0x80
#define MAXNUM  10#define TIMEPRESS  350 //key press times
#define DIG1 17
#define DIG2 25
#define DIG3 21
#define DIG4 29
#define ADDRMAX 512uint8_t i;uint16_t value=0;void myGPIO_init(void)
{/* enable GPIOB clock */rcu_periph_clock_enable(RCU_GPIOA);	gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_0);//PB6_42  I2C0_SCL GPIO_OTYPE_PP推挽输出gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);	
}/****** 按键处理函数
*一定不能有do while , delay 等阻塞语句,要快进快出,main函数有更重要的事情要做
******/
void keycheck(void)
{uint16_t KeyNum;uint16_t LastKeyNum = 0;static uint8_t Keyleased=1,fastCnt=0;static uint16_t keydowntime = 0;//uint8_t lontimeflag = 1;KeyNum = GetKey();switch(KeyNum){case DIG2:if(keydowntime++ >= TIMEPRESS )//long press ++{keydowntime=TIMEPRESS;if(++fastCnt>=10)//add press times 分频{fastCnt=0;value++;if(value > ADDRMAX) value = 1;  //512 to 1}}else if(Keyleased && keydowntime < TIMEPRESS )//short press ++{value++;	Keyleased = 0;//keydown locked  加锁if(value > ADDRMAX) value = 1;    //512 to 1}break;	case DIG3:	if( keydowntime++ >= TIMEPRESS)//long press --{	keydowntime=TIMEPRESS;if(++fastCnt>=10)//add press times 分频{fastCnt=0;value--;if(value == 0) value = ADDRMAX;   //0 to 512}}else if(Keyleased  && keydowntime++ < TIMEPRESS )//short press --{value--;Keyleased=0; //keydown locked	加锁if(value == 0) value = ADDRMAX;   //0 to 512}break;default:Keyleased=1;//keydown loosedfastCnt=0;keydowntime = 0;break;}
}//主函数处理
int main(void)
{uint8_t flag = 0;systick_config();myGPIO_init();delay_ms(10);i2c_init();while(1){flag =!flag;gpio_bit_write(GPIOA,GPIO_PIN_0,flag);delay_ms(1);keycheck();GN1650_display();//do work1		//do work2				} 
}/********** 数码管显示 **********/
void  GN1650_display(void)	
{		GN1650_Wrt_RAM(0x68,LEDENCODE[value/1000%10]);//high //0x48 系统指令  0x41//4级亮度 8段显示 显示开GN1650_Wrt_RAM(0x6A,LEDENCODE[value/100%10] );//   | LEDDOT);GN1650_Wrt_RAM(0x6C,LEDENCODE[value/10%10]);GN1650_Wrt_RAM(0x6E,LEDENCODE[value%10]); //lowGN1650_Wrt_RAM(0x48,0x01);//	GN1650_Wrt_RAM(0x68,LEDENCODE[value/1000%10]);//high //0x48 系统指令  0x41//4级亮度 8段显示 显示开
//	GN1650_Wrt_RAM(0x6A,LEDENCODE[value/100%10] | LEDDOT);
//	GN1650_Wrt_RAM(0x6C,LEDENCODE[value/10%10]);
//	GN1650_Wrt_RAM(0x6E,LEDENCODE[value%10]); //low	
}
/********** 数码管无显示 **********/
void  GN1650_display_D(void)	
{GN1650_Wrt_RAM(0x48,0x00);
}/**********  IIC初始化 *********/
void i2c_init(void)
{/* enable GPIOB clock */rcu_periph_clock_enable(RCU_GPIOB);/* enable I2C0 clock */rcu_periph_clock_enable(RCU_I2C0);/* connect PB6 to I2C0_SCL */gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6);/* connect PB7 to I2C0_SDA */gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_6);//PB6_42  I2C0_SCL gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_6);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_7);//PB7_43  I2C0_SDAgpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);/* configure I2C0 clock *///i2c_clock_config(I2C0,60000,I2C_DTCY_2);/* enable I2C0 */i2c_enable(I2C0);/* enable acknowledge */i2c_ack_config(I2C0,I2C_I2CMODE_ENABLE);/*  空闲状态 */gpio_bit_write(GPIOB,GPIO_PIN_6,1);gpio_bit_write(GPIOB,GPIO_PIN_7,1);GN1650_Wrt_RAM(0x48,0x00);//关闭显示}
void SDA_Rx(void)					//主机recv from 从机
{/* enable GPIOB clock */rcu_periph_clock_enable(RCU_GPIOB);gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);}
void SDA_Tx(void)
{/* enable GPIOB clock */rcu_periph_clock_enable(RCU_GPIOB);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_7);//PB7_43  I2C0_SDAgpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
}void IIC_SCL(uint8_t n)
{gpio_bit_write(GPIOB,GPIO_PIN_6,n);
}
void IIC_SDA(uint8_t n)
{gpio_bit_write(GPIOB,GPIO_PIN_7,n);
}static void IIC_Delay(void)
{__IO  uint16_t cnt=1;while(cnt--);
}/*********************模拟IIC通信****************/
/*
*函数功能:IIC起始
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/
static void IIC_Start1(void)
{SDA_Tx();//2、SCL 1IIC_SCL(1);//3、SDA 1IIC_SDA(1);//延时5usIIC_Delay();//4、SCL 0 IIC_SDA(0);//延时5usIIC_Delay();//5、SDA 0IIC_SCL(0);//延时5usIIC_Delay();		
}
/*
*函数功能:IIC结束
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/static void IIC_Stop1(void)
{//2、SCL 1IIC_SCL(1);//3、SDA 0IIC_SDA(0);//延时5usIIC_Delay();//4、SDA 1IIC_SDA(1);//延时5usIIC_Delay();
}/*
*函数功能:IIC应答
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/
void IIC_ACK(void)
{	SDA_Rx();IIC_SCL(0);IIC_Delay(); IIC_SDA(0); 	IIC_Delay();     IIC_SCL(1);IIC_Delay();                  IIC_SCL(0);                     IIC_Delay();SDA_Tx(); IIC_SDA(0);	IIC_Delay();}/****************模拟IIC通信**************//* 描述:一个字节数据发送函数               * 参数:  无* 返回值:无		*/void IIC_Wrt_Byte(uint8_t data)
{int i;	IIC_SCL(0);    //拉低时钟开始数据传输for(i = 0;i < 8;i++){IIC_SDA((data & 0x80)>0 ); //check bit7data <<= 1; 	  IIC_Delay();   //这三个延时都是必须的IIC_SCL(1);IIC_Delay(); IIC_SCL(0);	IIC_Delay();	}	
}/* 描述:一个字节数据接收函数               * 参数:  无* 返回值:接收到的字节数据		*/uint8_t IIC_Rev_Byte(void)
{uint8_t dat=0;uint8_t i;	SDA_Rx();			/* 设置数据线为输入方式 */IIC_Delay();                    for(i = 0;i < 8;i++){  IIC_SCL(0);		/* 设置时钟线为低,准备接收数据位	*/IIC_Delay();               IIC_SCL(1);		/* 设置时钟线为高使数据线上数据有效  */              if(READ_SDA) dat|=0x80;	//同ret++; /* 读数据位,接收的数据位放入ret中 */dat>>=1;IIC_Delay();}IIC_SCL(0); return dat;
}// write to RAM
void GN1650_Wrt_RAM(uint8_t Address, uint8_t Data)
{IIC_Start1();IIC_Wrt_Byte(Address);IIC_ACK();IIC_Wrt_Byte(Data);IIC_ACK();IIC_Stop1();	
}
/********** 按键扫描函数 get 按键 ID **********/
uint8_t GetKey(void)
{uint8_t key=0;IIC_Start1();IIC_Wrt_Byte(0x49);IIC_ACK();key= IIC_Rev_Byte();IIC_ACK();IIC_Stop1();return key;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/637264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依微服务框架,富文本加入图片保存时出现JSON parse error: Unexpected character (‘/‘ (code 47)):...

若依微服务框架&#xff0c;富文本加入图片保存时出现JSON parse error: Unexpected character 一、问题二、解决1.修改网关配置2、对数据进行加密解密2.1安装插件2.2vue页面加密使用2.3后台解密存储 一、问题 若依微服务项目在使用富文本框的时候&#xff0c;富文本加入图片进…

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(一):基础知识考察

关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第一部分:基础知识考察,子节点表示追问或同级提问 基本概念 包括一些核心问…

ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types

异常类型详解 Exception types 一&#xff0c; 什么是异常二&#xff0c;同步异常&#xff08;synchronous exceptions&#xff09;2.1 无效的指令和陷阱异常&#xff08;Invalid instructions and trap exceptions&#xff09;2.2 内存访问产生的异常2.3 产生异常的指令2.4 调…

基于JavaWeb+SSM+Vue智能社区服务小程序系统的设计和实现

基于JavaWebSSMVue智能社区服务小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相…

【排序算法】六、快速排序(C/C++)

「前言」文章内容是排序算法之快速排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 快速排序1.1 原理1.2 Hoare版本&#xff08;单趟&#xff09;1.3 快速排序完整代码&…

Excel 根据日期按月汇总公式

Excel 根据日期按月汇总公式 数据透视表日期那一列右击&#xff0c;选择“组合”&#xff0c;步长选择“月” 参考 Excel 根据日期按月汇总公式Excel如何按着日期来做每月求和

Linux内存管理:(九)内存规整

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 引言 伙伴系统以页面为单位来管…

leetcode:每日温度---单调栈

题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例&…

天龙八部资源提取工具(提取+添加+修改+查看+教程)

可以提取&#xff0c;添加&#xff0c;修改&#xff0c;查看天龙八部里面的数据。非常好用。 天龙八部资源提取工具&#xff08;提取添加修改查看教程&#xff09; 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1XOMJ1xvsbD-UUQOv3QfHPQ?pwd0kd0 提取码&…

赛车游戏简单单车C语言版

#include<stdio.h> #include<easyx.h> #include<time.h>#define WIDTH 512 #define HEIGHT 768//定义一个汽车类 struct FCar {//坐标float x, y;// 汽车种类int type;//汽车速度float speed; };//定义全局变量 图片坐标 IMAGE BG_IMG; //背景图片坐标 float…

logstack 日志技术栈-04-opensource 开源工具 SigNoz+Graylog

3. SigNoz SigNoz 是一个日志收集和分析工具&#xff0c;可以收集和管理来自各种来源的日志、指标、跟踪和异常。 它为使用 OpenTelemetry 检测应用程序提供本机支持&#xff0c;以防止供应商锁定&#xff0c;将收集到的数据存储在 ClickHouse 中&#xff0c;然后在用户友好的…

【实战】SpringBoot自定义 starter及使用

文章目录 前言技术积累SpringBoot starter简介starter的开发步骤 实战演示自定义starter的使用写在最后 前言 各位大佬在使用springboot或者springcloud的时候都会根据需求引入各种starter&#xff0c;比如gateway、feign、web、test等等的插件。当然&#xff0c;在实际的业务…

灵活扩展:深入理解MyBatis插件机制

第1章&#xff1a;MyBatis插件的重要性 大家好&#xff0c;我是小黑&#xff0c;咱们今天要聊的是MyBatis插件&#xff0c;MyBatis&#xff0c;大家都不陌生&#xff0c;它是一个ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;让咱们在操作数据库时能更加优雅。但今…

web漏洞总结大全(基础)

前言 本文章是和cike_y师傅一起写的&#xff0c;cike_y博客&#xff1a;https://blog.csdn.net/weixin_53912233?typeblog 也欢迎大家对本文章进行补充和指正&#xff0c;共同维护这个项目&#xff0c;本文的github项目地址&#xff1a; https://github.com/baimao-box/Sum…

Haxe-UnrealEngine5

Haxe-UnrealEngine5 结论 UE C header > External/**.hx.hx > .h/.cpp&#xff0c;和 UE C 一起编译使用 hxcpp 来调试 .hx good&#xff1a; 理论上不仅限反射代码走 UE C&#xff0c;无需维护 backend&#xff0c;比如 Lua Binding理论上接近 UE C 的性能 bad&…

六、Netty核心模块组件

目录 6.1 BootStrap&#xff0c;ServerBootStrap6.2 Future&#xff0c;ChannelFuture6.3 Channel6.4 Selector6.5 ChannelHandler 以及其实现类6.6 Pipeline 和 ChannelPipeline6.7 ChannelHandlerContext6.8 ChannelOption6.9 EventLoopGroup和其实现类 NioEventLoopGroup6.1…

激光无人机打击系统——光束控制和指向系统

激光无人机&#xff08;UAV&#xff09;打击系统中的光束控制和指向系统通常包括以下几个关键组件和技术&#xff1a; 激光发射器&#xff1a;这是系统的核心&#xff0c;负责生成高能量的激光束。常用的激光类型包括固体激光器、化学激光器、光纤激光器等&#xff0c;选择取决…

微软Microsoft推出针对学生的AI练习英语口语工具”阅读教练“:Reading Coach

阅读教练官网链接&#xff1a;https://coach.microsoft.com AI工具专区&#xff1a;AI工具-喜好儿aigc 学生可以通过选择角色和设定&#xff0c;利用AI生成独特的故事&#xff0c;从而激发阅读兴趣并提高阅读流畅度。语音转文本AI能够实时分析学生的阅读流利性&#xff0c;检测…

Golang 搭建 WebSocket 应用(八) - 完整代码

本文应该是本系列文章最后一篇了&#xff0c;前面留下的一些坑可能后面会再补充一下&#xff0c;但不在本系列文章中了。 整体架构 再来回顾一下我们的整体架构&#xff1a; 在我们的 demo 中&#xff0c;包含了以下几种角色&#xff1a; 客户端&#xff1a;一般是浏览器&am…

图论:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)详细版

终于是学完了&#xff0c;这个最短路我学了好几天&#xff0c;当然也学了别的算法啦&#xff0c;也是非常的累啊。 话不多说下面看看最短路问题吧。 最短路问题是有向图&#xff0c;要求的是图中一个点到起点的距离&#xff0c;其中我们要输入点和点之间的距离&#xff0c;来求…