本帖最后由 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)
|