查看:
3332
|
回复:
2
|
GD32 MCU 开发板 Workshop 报告_驱动A7108
|
西点
2
主题
49
回复 |
发表于2019-05-14 23:34:49
|
显示全部楼层
1#
电梯直达
GD32 MCU 开发板 Workshop 报告一、方案简介 本方案基于GD32E231C-START 评估板,评估板使用GD32E231C8T6作为主控制器。无线通信部分采用 笙科电子高效能Sub 1GHz家族芯片中的A7108。A7108 是适用于 315/433/470/ 510/868/915MHz 的无 线应用。低功耗,最大功率可达到19dBm,不需要外加LNA与PA就可适用长距离应用。因此,非常适 合470MHZ~510MHZ中国的无线抄表系统与868MHZ欧洲Wireless Meter Bus。A7108的传输速度是可 程序化的,从2K到250Kbps可满足不同的系统需求。在传输方面,A7108分别在TX/RX都有64Byte的 FIFO,可提供接收和发送数据。在接口方面,A7108提供3线SPI模式,SCS,SCK,SDIO。另外加一个数据收发完成中断 引脚。加上电源,6根线即可满足通信的需求。 二、GD32 MCU产品的介绍 ? GD32E231C8T6主要规格参数: ? Cortex ? -M23 32-bit MCU@72MHZ ? ROM:64KB ? RAM: 8KB ? UART/USART: 2路 ? SPI: 2路 ? 工作电压: 1.8V~3.6V ? I/O数量:38 ? 系统架构
GD32E231的系统架构如上图所示。 三、方案介绍及框图 利用GD32 MCU完成对A7108的驱动,实现发送数据。并将发送的数据通过串口打印出来。每发送一次,LED闪烁一次。
四、调试记录 ? 首先实现对LED灯的驱动。按照DEMO例子,很容易就上手了。 ? 实现对USART0的驱动。按照以往的习惯,主动发送,中断接收。通过阅读DEMO例子,发现GD32E231的串口驱动比STM32封装程度更高,库函数写的不错,容易让人理解。 封装好的串口初始化函数。 void com_usart_init(unsigned int uiBaudrate) { /* enable COM GPIO clock */ rcu_periph_clock_enable(RCU_GPIOA);
/* connect port to USARTx_Tx */ gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
/* connect port to USARTx_Rx */ gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
/* configure USART Tx as alternate function push-pull */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);
/* configure USART Rx as alternate function push-pull */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);
/* enable USART clock */ rcu_periph_clock_enable(RCU_USART0);
/* USART configure */ usart_deinit(USART0); usart_word_length_set(USART0, USART_WL_8BIT); usart_stop_bit_set(USART0, USART_STB_1BIT); usart_parity_config(USART0, USART_PM_NONE); usart_baudrate_set(USART0, uiBaudrate); usart_receive_config(USART0, USART_RECEIVE_ENABLE); usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
/* enable USART TBE interrupt */ // usart_interrupt_enable(USART0, USART_INT_TBE); usart_interrupt_enable(USART0, USART_INT_RBNE); nvic_irq_enable(USART0_IRQn, 0);
usart_enable(USART0); }
串口发送函数: //============================================================================= //文件名称: //功能概要:USART0发送一个字节函数 //参数说明:第一个参数为待发送的数据 //函数返回:无 //============================================================================= void USART0_SendOneByte(uint8_t Byte) { usart_data_transmit(USART0, (uint8_t) Byte); while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); }
//============================================================================= //文件名称: //功能概要:USART0发送函数 //参数说明:第一个参数为待放的数据缓冲区,第二个变量为数据长度 //函数返回:无 //============================================================================= void USART0_SendBuf(uint8_t *pBuf, uint16_t u16Len) { while(u16Len--) { usart_data_transmit(USART0, *pBuf++); while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); } }
? 移植A7108的驱动及发送函数。最早的A7108驱动是在51单片机上面写的,由于51与GD32E231的区别,在IO模拟SPI口读写上面,数据的读写需要转换方向。我是这么做的。
#define ReadMode 1 #define WriteMode 2
void A7108_SDIO_Mode(unsigned char ucMode) { if(ucMode == ReadMode) { rcu_periph_clock_enable(A7108_SDIO_GPIO_CLK); /* configure button pin as input */ gpio_mode_set(A7108_SDIO_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, A7108_SDIO_PIN); // SDIO 输入模式 } else if(ucMode == WriteMode) { rcu_periph_clock_enable(A7108_SDIO_GPIO_CLK); gpio_mode_set(A7108_SDIO_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,A7108_SDIO_PIN); gpio_output_options_set(A7108_SDIO_GPIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,A7108_SDIO_PIN); // sdio 输出模式 } } 每次读写改变时调用此函数,切换方向。以GD32E231 单片机72MHZ的速度,切换速度很快。
五、实验图片及驱动源代码
上传驱动源代码,放到官方任意一个按键DEMO例子里面就可以驱动。 |
|