本次实验使用了一块0.96寸128*64分辨率SPI接口OLED模块,利用AC7811QBGE微控制器片上的硬件SPI资源进行驱动,实现SPI主机写操作。实验工程依然使用了“AutoGen Studio”创建。下面是实验过程:
一、实验资源
1、AC7811-MINI开发板;
2、AutoGen Studio 1.2.0;
3、KEIL 5.28.0.0;
4、0.96寸128*64 OLED
二、资源简介
AC7811QBGE微控制器片上有两个SPI模块,分为SPI1及SPI2。支持主、从及全双工模式,支持DMA,主机可编程传送比特率,传输帧格式可在4-16位选择等。
根据SPI时钟极性(CPOL)和时钟相位(CPHA)配置可分为不同的SPI模式:
当SPI设备空闲时的时钟极性(CPOL)决定了SCK线电平的高、低,即CPOL=0时SCK=0;CPOL=1时SCK=1。在数据采集时刻,CPHA=0时数据线上的信号将会在SCK时钟线的奇数边沿被采样;CPHA=1时数据线上的信号将会在SCK时钟线的偶数边沿被采样。本次实验中配置结果为CPOL=1;CPHA=1:
三、代码实现
利用“AutoGen Studio”创建的SPI2初始化代码:
/* SPI2 init function */
void ATC_SPI2_Init(void)
{
SPI_ConfigType config;
MSP_SPI_Init(SPI2);
config.sckHigh = 5;
config.sckLow = 5;
config.csHold = 5;
config.csSetup = 5;
config.setting.csIdle = 5;
config.setting.txEmptyIntEn = 0;
config.setting.rxFullIntEn = 0;
config.setting.txUnderflowIntEn = 0;
config.setting.rxOverflowIntEn = 0;
config.setting.master = 1;
config.setting.modeErrorIntEn = 0;
config.setting.dmaTxEn = 0;
config.setting.dmaRxEn = 0;
config.setting.cpol = 1;
config.setting.cpha = 1;
config.setting.txMsbFirst = 1;
config.setting.rxMsbFirst = 1;
config.setting.frmSize = 7;
config.setting.csOutputEn = 0;
config.setting.modeFaultEn = 0;
config.setting.continuousCSEn = 0;
config.setting.wakeUpEn = 0;
config.setting.spiEn = 1;
config.setting.swReset = 0;
config.setting.intEn = 0;
SPI_Initialize(SPI2, &config);
SPI_TxOnlyEnable(SPI2);
}
对于SPI2的写操作只有一行代码:
/***************************************************************************
* 描 述 : SPI写一个字节数据函数
* 入 参 : Dat:写入的数据 mode=0写入命令;mode=1写入数据
* 返回值 : 无
**************************************************************************/
static void SPI_WriteByte(uint16_t Dat,uint8_t mode)
{
if(mode == OLED_WR_CMD) OLED_DC_0;
else OLED_DC_1;
SPI_WritePoll(SPI2, &Dat, 1);
}
主函数中直接向OLED送显数据:
LCD_P8x16Str(20,0,"AC7811-MINI");
LCD_P8x16Str(24,2,"AC7811QBGE");
LCD_P8x16Str(12,4,"TXONLY_MASTER");
LCD_P8x16Str(12,6,"SPI2 0.96OLED");
四、实验结果
五、实验总结
实验的成功总是会给我带来满心的喜悦和不小的成就感,当然这还是得益于“AutoGen Studio”软件使用的便捷、文档资料的全面以及AC781X系列微控制性能强大、易于操控的本质。
|