片上通讯方式一般使用到的只有这么三种:RS232(TTL电平),I2C接口与SPI接口。前两者一般仅为低速数据交换时使用,但是SPI接口是可以双工通信且通讯速度可以达到18Mbit/s。版主今天就为大家介绍SPI通讯接口与使用实例。
SPI接口由于其高速通讯的特征,已广泛应用于双机之间通讯,高速数据采集芯片,大容量外置存储芯片与显示屏驱动。考虑到版主经济实力的问题,这里版主使用一款SPI接口的OLED屏做为实例为大家简单介绍SPI接口,做为入门的阶梯。
通过查询OLED屏的用户指导文件,我们将MCU相应引脚与其正确相连,之后我们进入软件配置阶段。
SPI接口的配置参数有以下几个:
1、工作模式:是主模式,还是从模式。这里由于我们使用MCU控制OLED屏,因此MCU需要工作在主模式下;
2、数据位:我们一般选择8位数据位。因为我们的OLED屏是工作在8位数据模式下;
3、时钟线与数据锁存:这个选项非常重要。关系到从机如何读取数据,因此,我们需要查询OLED屏的用户指导。下图介绍了其工作时序:
4、片选位:工作在主模式下,片选位须选择为软件控制。
5、数据对齐方式:SPI数据传输时可以先发送高位,也可以先发送低位。这个主要依据从机与数据帧的约定方式,这里我们根据OLED屏来选择高位优先。
到这里SPI接口就配置完毕了。
当然,完成SPI配置后,还要有OLED驱动的编写,这样最终才能成功驱动并显示图片出来。OLED驱动的部分我们留在下一章节再讨论。
(细心的网友可以猜一下上面这个液晶屏内容是不是在哪里也出现过啊?)
源代码:
/** * @brief 初始化OLED灯引脚 * @param * @retval * @date 2015-04-04 * @note D0 => PA5 SPI_CLK; D1 => PA7 SPI_MOSI; * DC => PA6 GPIO; RST => PA3 GPIO; CS => PA4 GPIO; */ void LEDPIN_Init(void) //初始化引脚口,请在OLED进行修改你所对应的引脚,均为普通脚输出 { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitStructure); OLED_RST(); OLED_SELECT(); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0); /* SPI configuration -------------------------------------------------------*/ SPI_I2S_DeInit(SPI1); SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPI1, &SPI_InitStructure); SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_HF); SPI_Cmd(SPI1, ENABLE); }
工程文件: