[学习笔记] 【AutoChips MCU评测报告】六、SPI

[复制链接]
1314|3
 楼主| lisingch 发表于 2020-6-13 16:49 | 显示全部楼层 |阅读模式
      本次实验使用了一块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位选择等。
2020-06-13_160551.png
2020-06-13_160602.png
2020-06-13_160613.png
2020-06-13_160742.png

根据SPI时钟极性(CPOL)和时钟相位(CPHA)配置可分为不同的SPI模式:
2020-06-13_161335.png
2020-06-13_161318.png
2020-06-13_161350.png
2020-06-13_161407.png
当SPI设备空闲时的时钟极性(CPOL)决定了SCK线电平的高、低,即CPOL=0时SCK=0;CPOL=1时SCK=1。在数据采集时刻,CPHA=0时数据线上的信号将会在SCK时钟线的奇数边沿被采样;CPHA=1时数据线上的信号将会在SCK时钟线的偶数边沿被采样。本次实验中配置结果为CPOL=1;CPHA=1:
2020-06-13_163145.png

三、代码实现
利用“AutoGen Studio”创建的SPI2初始化代码:
  1. /* SPI2 init function */
  2. void ATC_SPI2_Init(void)
  3. {
  4.     SPI_ConfigType config;

  5.     MSP_SPI_Init(SPI2);
  6.     config.sckHigh = 5;
  7.     config.sckLow = 5;
  8.     config.csHold = 5;
  9.     config.csSetup = 5;
  10.     config.setting.csIdle = 5;
  11.     config.setting.txEmptyIntEn = 0;
  12.     config.setting.rxFullIntEn = 0;
  13.     config.setting.txUnderflowIntEn = 0;
  14.     config.setting.rxOverflowIntEn = 0;
  15.     config.setting.master = 1;
  16.     config.setting.modeErrorIntEn = 0;
  17.     config.setting.dmaTxEn = 0;
  18.     config.setting.dmaRxEn = 0;
  19.     config.setting.cpol = 1;
  20.     config.setting.cpha = 1;
  21.     config.setting.txMsbFirst = 1;
  22.     config.setting.rxMsbFirst = 1;
  23.     config.setting.frmSize = 7;
  24.     config.setting.csOutputEn = 0;
  25.     config.setting.modeFaultEn = 0;
  26.     config.setting.continuousCSEn = 0;
  27.     config.setting.wakeUpEn = 0;
  28.     config.setting.spiEn = 1;
  29.     config.setting.swReset = 0;
  30.     config.setting.intEn = 0;
  31.     SPI_Initialize(SPI2, &config);
  32.     SPI_TxOnlyEnable(SPI2);

  33. }

对于SPI2的写操作只有一行代码:
  1. /***************************************************************************
  2. * 描  述 : SPI写一个字节数据函数
  3. * 入  参 : Dat:写入的数据 mode=0写入命令;mode=1写入数据
  4. * 返回值 : 无
  5. **************************************************************************/
  6. static void SPI_WriteByte(uint16_t Dat,uint8_t mode)                                       
  7. {               
  8.   if(mode == OLED_WR_CMD) OLED_DC_0;   
  9.   else  OLED_DC_1;
  10.    
  11.         SPI_WritePoll(SPI2, &Dat, 1);
  12. }

主函数中直接向OLED送显数据:
  1. LCD_P8x16Str(20,0,"AC7811-MINI");
  2.         LCD_P8x16Str(24,2,"AC7811QBGE");
  3.         LCD_P8x16Str(12,4,"TXONLY_MASTER");
  4.         LCD_P8x16Str(12,6,"SPI2 0.96OLED");

四、实验结果
微信图片_20200613013610.jpg
微信图片_20200613013606.jpg

五、实验总结
      实验的成功总是会给我带来满心的喜悦和不小的成就感,当然这还是得益于“AutoGen Studio”软件使用的便捷、文档资料的全面以及AC781X系列微控制性能强大、易于操控的本质。

marginer 发表于 2020-6-15 13:49 | 显示全部楼层
LZ的系列专题做得不错,有写书的潜力
 楼主| lisingch 发表于 2020-6-15 14:32 | 显示全部楼层
marginer 发表于 2020-6-15 13:49
LZ的系列专题做得不错,有写书的潜力

谢谢领导的表扬和鼓励!继续努力
jiuguang 发表于 2021-4-20 14:16 | 显示全部楼层
他的读函数呢,我写读函数的时候SCK没有时钟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15007

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部