首先,在这里感谢某网友(lisingch),对我的测评进行了技术指导。 OLED目前是比较普遍的显示器件了,淘宝价格也是很便宜的。
网上搜了一圈,找到了数据手册,初始化寄存器的时候会用到的,所以手册还是有必要看一看。
方便网友下载,这里我先贴出来:
091寸OLED模块原理图_IIC接口.pdf
(52.35 KB, 下载次数: 40)
SSD1306-Revision 1.0.pdf
(1.35 MB, 下载次数: 49)
一,此款OLED为IIC接口,硬件原理图如图,说明从IIC地址为0x78.与MCU的I2C2 接口相连接。
对于IIC,这里采用了硬件IIC,没有用模拟的,这样效率更高一些,看看我们的初始化函数,iic的速率设置为400K的Fast 模式。
- /**
- ******************************************************************************
- ** \brief Initialize the I2C peripheral for master
- **
- ** \param None
- **
- ** \retval
- **
- **
- ******************************************************************************/
- void I2C_Master_Config(void)
- {
- stc_i2c_init_t stcI2cInit;
- stc_clk_freq_t stcClkFreq;
- /* Initialize I2C port*/
- PORT_SetFunc(I2C2_SCL_PORT, I2C2_SCL_PIN, Func_I2c2_Scl, Disable);
- PORT_SetFunc(I2C2_SDA_PORT, I2C2_SDA_PIN, Func_I2c2_Sda, Disable);
- /* Enable I2C Peripheral*/
- PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_I2C2, Enable);
- I2C_DeInit(I2C_CH);
- /* Get system clock frequency */
- CLK_GetClockFreq(&stcClkFreq);
- MEM_ZERO_STRUCT(stcI2cInit);
- stcI2cInit.enI2cMode = I2cMaster;
- stcI2cInit.u32Pclk3 = stcClkFreq.pclk3Freq;
- stcI2cInit.u32Baudrate = 400000ul;
- stcI2cInit.u32SclTime = 0ul;
- I2C_Init(I2C_CH, &stcI2cInit);
- I2C_Cmd(I2C_CH, Enable);
- }
然后就是最关键的IIC读写函数了。
- /**
- ******************************************************************************
- ** \brief Send data to slave
- **
- ** \param pTxData Pointer to the data buffer
- ** \param u32Size Data size
- **
- ** \retval
- **
- **
- ******************************************************************************/
- void Master_WriteData(uint8_t Data, uint32_t u32Size)
- {
- uint32_t u32TimeOut = TIMEOUT;
- while(u32Size--)
- {
- /* Wait tx buffer empty */
- u32TimeOut = TIMEOUT;
- while(Reset == I2C_GetStatus(I2C_CH, I2C_SR_TEMPTYF))
- {
- if(0ul == (u32TimeOut--))
- {
- break;
- }
- }
- /* Send one byte data */
- I2C_SendData(I2C_CH, Data);
- /* Wait transfer end*/
- u32TimeOut = TIMEOUT;
- while(Reset == I2C_GetStatus(I2C_CH, I2C_SR_TENDF))
- {
- if(0ul == (u32TimeOut--))
- {
- break;
- }
- }
- /* Check ACK */
- u32TimeOut = TIMEOUT;
- while(Set == I2C_GetStatus(I2C_CH, I2C_SR_NACKDETECTF))
- {
- if(0ul == (u32TimeOut--))
- {
- break;
- }
- }
- }
- }
基本的iic驱动就OK了,剩下的就是oled取模,这里贴一下取模方式,方便网友参考。
驱动好了,再看看Main函数:
整个工程目录非常清爽!
再上一张靓照效果图:
|