打印
[活动专区]

【AT-START-F407测评】五、SPI_OLED

[复制链接]
998|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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)


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14993

帖子

17

粉丝