本帖最后由 lisingch 于 2021-1-31 21:25 编辑
本次实验利用开发板上的SPI1接口驱动0.91'OLED,这个OLED与前面试验所用的I2C接口OLED同样都是128*32分辨率,外形尺寸也是相当,唯一不同的只是控制接口,一个SPI一个是I2C。
一、实验资源
1、AT-START-F407开发板;
2、keil v5.31.0.0;
3、BSP等相关资源;
4、0.91'OLED(SPI)
二、相关知识学习
AT32F407VGT7微控制器配置了4个SPI接口,可以配置为支持SPI协议或者支持I2S音频协议,默认工作在SPI方式。支持半双工、全双工、同步、串行等通信方式。支持主、从操作,支持8位或16位数据传输,支持硬件CRC等:
在使用时注意配置SPI时钟信号的相位和极性:
本次实验只是向OLED输送数据,因此只使用了SPI的主模式,片选信号使用软件控制。
三、硬件连接
OLED模块采用拆机的OLED屏打板自制,接口排针的序列兼容了市面上常用的7针OLED显示模块接口。
OLED_SCK ---->PA5
OLED_MOSI---->PA7
OLED_RES ---->PA4
OLED_DC ---->PA6
OLED_CS ---->PA2
四、程序实现
实现的代码是在“BSP”相关代码的基础上进行了移植和修改,OLED代码均来自于网络。
SPI配置:
- static void SPI1_Config(void)
- {
- SPI_InitType SPI_InitStructure;
- /* SPI1 Config -------------------------------------------------------------*/
- SPI_DefaultInitParaConfig(&SPI_InitStructure);
- SPI_InitStructure.SPI_TransMode = SPI_TRANSMODE_FULLDUPLEX;
- SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
- SPI_InitStructure.SPI_FrameSize = SPI_FRAMESIZE_8BIT;//
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_HIGH;//SPI_CPOL_LOW;//
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2EDGE;
- SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;
- SPI_InitStructure.SPI_MCLKP = SPI_MCLKP_2;
- SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;//
- SPI_InitStructure.SPI_CPOLY = 0;
-
- SPI_Init(SPI1, &SPI_InitStructure);
-
- /* Enable SPI1 */
- SPI_Enable(SPI1, ENABLE);
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Configures the different system clocks.
- * @param None
- * @retval None
- */
- static void SPI1_RCC_Config(void)
- {
- /* Enable peripheral clocks --------------------------------------------------*/
- /* GPIOA SPI1 clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_SPI1, ENABLE);
-
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Configures the different GPIO ports.
- * @param None
- * @retval None
- */
- static void SPI1_PORT_Config(void)
- {
- GPIO_InitType GPIO_InitStructure;
- /* Configure SPI1 pins: SCK, MOSI ---------------------------------*/
- /* Confugure SCK and MOSI pins as Alternate Function Push Pull */
- GPIO_InitStructure.GPIO_Pins = GPIO_Pins_5 | GPIO_Pins_7;
- GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void SPI1_Init(void)
- {
- SPI1_PORT_Config();
- SPI1_RCC_Config();
- SPI1_Config();
- }
OLED“写”代码:
- void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
- {
- if(cmd) OLED_DC_Set();
- else OLED_DC_Clr();
- /* Check Transmit buffer empty flag */
- while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TE) == RESET);
- SPI_I2S_TxData(SPI1, dat);
- }
主函数:- int main(void)
- {
- AT32_Board_Init();
- SPI1_Init();
- OLED_Init();
- OLED_Clear();
-
- OLED_ShowCHinese(0,0,0);//雅
- OLED_ShowCHinese(16,0,1);//特
- OLED_ShowCHinese(32,0,2);//力
- OLED_ShowCHinese(48,0,3);//科
- OLED_ShowCHinese(64,0,4);//技
-
- OLED_ShowString(24,2,"AT-START-F407");
- while(1)
- {
- }
- }
五、实验结果
六、总结
通过本次实验对AT32F407VGT7的SPI主模式“写”操作的应用进行了初步的认识,实验的成功为后期更深入地学习奠定了基础。
七、附件
SPI_oled.rar
(6.43 MB, 下载次数: 21)
|