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

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

  • 波形图
  • 小实验
    • 1) 数码管显示很土的LOVE,间隔一秒,点亮一次
    • 2)从0一直加到999,循环
  • 总结

波形图

第一位0x68的
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第1张图片
第二位0x6A的
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第2张图片
第三位0x6C的
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第3张图片
第四位0x6E的
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第4张图片
系统指令0x48的
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第5张图片
总图
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第6张图片

小实验

1) 数码管显示很土的LOVE,间隔一秒,点亮一次

#define NUM_L 0x38
#define NUM_O 0x3F
#define NUM_V 0x7E
#define NUM_E 0x79

#define LEDDOT 0x80//小数点
uint8_t i;

//主函数处理,系统资源管理线程独占阻塞模式
int main(void)
{
	systick_config();
		
	myGPIO_init();
	
	delay_ms(10);
 	
	i2c_init();

    while(1)
	{
		GN1650_display();
		delay_ms(1000);
		GN1650_display_D();
		delay_ms(1000);
	} 
}

/********** 数码管显示 **********/
void  GN1650_display(void)	
{		
    //love	
	GN1650_Wrt_RAM(0x68,NUM_L);
	GN1650_Wrt_RAM(0x6A,NUM_O);	
	GN1650_Wrt_RAM(0x6C,NUM_V);
 	GN1650_Wrt_RAM(0x6E,NUM_E);
	GN1650_Wrt_RAM(0x48,0x01);	
}
/********** 数码管无显示 **********/
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_SDA
	 gpio_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)     //主机 send to 从机
{
	 /* 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_SDA
	 gpio_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 1
	IIC_SCL(1);
	//3、SDA 1
	IIC_SDA(1);
	//延时5us
	IIC_Delay();
	//4、SCL 0 
	IIC_SDA(0);
	//延时5us
	IIC_Delay();
	//5、SDA 0
	IIC_SCL(0);
	//延时5us
	IIC_Delay();		
}

/*
*函数功能:IIC结束
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/

static void IIC_Stop1(void)
{
	//2、SCL 1
	IIC_SCL(1);
	//3、SDA 0
	IIC_SDA(0);
	//延时5us
	IIC_Delay();
	//4、SDA 1
	IIC_SDA(1);
	//延时5us
	IIC_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通信**************/
// 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();	
}
// IIC  write  one byte data  
void IIC_Wrt_Byte(uint8_t data)
{
	int i;	
    IIC_SCL(0);    //拉低时钟开始数据传输
	for(i = 0;i < 8;i++)
	{
		//IIC_SDA((data & 0x80)>0 ); //check bit0
        //data >>= 1; 	
		IIC_SDA((data & 0x80)>0 ); //check bit7 
        data <<= 1; 	  
		IIC_Delay();   //这三个延时都是必须的
		IIC_SCL(1);
		IIC_Delay(); 
		IIC_SCL(0);	
		IIC_Delay();	
	}	
}

注意void SDA_Tx(void)这个函数可有可无,因为I2c_init()里初始化默认PB7是OUTPUT;此外,这三句注释不注释,都没有影响

	 /* 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);
	 /* configure I2C0 clock */
	 //i2c_clock_config(I2C0,60000,I2C_DTCY_2);

2)从0一直加到999,循环

void  GN1650_display(void)	
{	
	static uint16_t value=0;
	
	GN1650_Wrt_RAM(0x68,LEDENCODE[value/1000%10]);//high 
	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	
	
	GN1650_Wrt_RAM(0x48,0x01);//0x48 系统指令,调节亮度 ,0x01现在是最亮  //  0x41//4级亮度 8段显示 显示开	
	
	value++;
	if(value>9999) value=0;
}	

只要IIC模拟出来了,GN1650数码管能点亮了,至于显示什么,怎么显示,都大同小异了。
视频中数码管亮度不是很亮的原因是,数码管的电路串了电阻;

GN1650

总结

	//IIC_SDA((data & 0x01)>0 ); //check bit0
  //  data >>= 1; 

注意GN1650是先传高位再传低位,我之前就是先传的低位,所以数码管不显示,此外要观察芯片对应的时序图,比如开始条件是SCL和SDA都为高电平,SDA先为低电平,SCL再为低电平,结束条件反之亦然;还有延时函数之前用的系统的delay_us(); 后来封装了一个简短的 IIC_Delay();时序的频率会更快;
GD32E230C8T6《调试篇》之 (软件) IIC通信 + GN1650驱动芯片 + 4位8段数码管显示(成功)_第7张图片

如有不清楚的可以看看《调试篇》的三篇IIC合集 

你可能感兴趣的:(GD32资源调试篇,单片机,嵌入式硬件)