最近在学习OLED的SPI4线传输
主控:STM32F103C8T6
OLED:1.3寸OLED,7管脚(GND,VCC,CLK,MOSI,RES,DC,CS);
目前情况:改写原子哥mini板程序,不能运行。
图一
接线方式:
CLK ------> A5 SPI1_CLK
MOSI-----> A7 SPI1_MOSI
RES ------> A1
DC -------> A6 SPI1_MISO
CS -------> A4 SPI_NSS
[mw_shl_code=c,true]void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD ; //???ì????
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Write(GPIOB,0X03);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //?è??SPI???ò?ò?????ò??????????:SPI?è???????????ò?????¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //?è??SPI?¤×÷????:?è?????÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //?è??SPI???????ó??:SPI·???????8?????á??
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //???????®???±????????:?±???ü????
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //?????????????????±????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS???????????¨NSS?????©?????í???¨????SSI???©???í:????NSS??????SSI??????
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //?¨???¨?????¤·???????:?¨?????¤·???????256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //???¨??????????MSB??????LSB??????:??????????MSB??????
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC?????????à????
SPI_Init(SPI1, &SPI_InitStructure); //?ù??SPI_InitStruct?????¨???????????????èSPIx?????÷
SPI_Cmd(SPI1, ENABLE); //????SPI???è
// SPIx_ReadWriteByte(0xff);//????????
#endif
OLED_WR_Byte(0xAE,OLED_CMD); //??±?????
OLED_WR_Byte(0xD5,OLED_CMD); //?è???±??·????ò×?,????????
OLED_WR_Byte(80,OLED_CMD); //[3:0],·????ò×?;[7:4],????????
OLED_WR_Byte(0xA8,OLED_CMD); //?è???????·??
OLED_WR_Byte(0X3F,OLED_CMD); //????0X3F(1/64)
OLED_WR_Byte(0xD3,OLED_CMD); //?è??????????
OLED_WR_Byte(0X00,OLED_CMD); //??????0
OLED_WR_Byte(0x40,OLED_CMD); //?è???????????? [5:0],????.
OLED_WR_Byte(0x8D,OLED_CMD); //????±??è??
OLED_WR_Byte(0x14,OLED_CMD); //bit2??????/??±?
OLED_WR_Byte(0x20,OLED_CMD); //?è?????????·????
OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00???????·????;01???????·????;10,?????·????;????10;
OLED_WR_Byte(0xA1,OLED_CMD); //?????¨???è??,bit0:0,0->0;1,0->127;
OLED_WR_Byte(0xC0,OLED_CMD); //?è??COM?¨?è·??ò;bit3:0,???¨????;1,???¨?????? COM[N-1]->COM0;N:?????·??
OLED_WR_Byte(0xDA,OLED_CMD); //?è??COM????????????
OLED_WR_Byte(0x12,OLED_CMD); //[5:4]????
OLED_WR_Byte(0x81,OLED_CMD); //??±????è??
OLED_WR_Byte(0xEF,OLED_CMD); //1~255;????0X7F (?????è??,???ó????)
OLED_WR_Byte(0xD9,OLED_CMD); //?è???¤????????
OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WR_Byte(0xDB,OLED_CMD); //?è??VCOMH ????±???
OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
OLED_WR_Byte(0xA4,OLED_CMD); //????????????;bit0:1,????;0,??±?;(°×??/????)
OLED_WR_Byte(0xA6,OLED_CMD); //?è??????·???;bit0:1,·??à????;0,????????
OLED_WR_Byte(0xAF,OLED_CMD); //????????
OLED_Clear();
} [/mw_shl_code]
[mw_shl_code=c,true]#define OLED_MODE 0
//-----------------OLED?????¨??----------------
#define OLED_CS PAout(4)
//#define OLED_RST PBout(14)//??MINISTM32???±????????STM32??????????
#define OLED_RS PCout(8)
#define OLED_WR PCout(7)
#define OLED_RD PCout(6)
//PB0~7,×÷????????
//#define DATAOUT(DataValue) {GPIO_Write(GPIOB,(GPIO_ReadOutputData(GPIOB)&0xff00)|(DataValue&0x00FF));}
//????4???®???????±????
#define OLED_SCLK PAout(5)
#define OLED_SDIN PAout(7)
#define OLED_CMD 0 //???ü??
#define OLED_DATA 1 //??????
//OLED??????????
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p);
#endif
[/mw_shl_code]
这是OLED.h的文件
[mw_shl_code=c,true]void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD ; //???ì????
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Write(GPIOB,0X03);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //?è??SPI???ò?ò?????ò??????????:SPI?è???????????ò?????¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //?è??SPI?¤×÷????:?è?????÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //?è??SPI???????ó??:SPI·???????8?????á??
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //???????®???±????????:?±???ü????
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //?????????????????±????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS???????????¨NSS?????©?????í???¨????SSI???©???í:????NSS??????SSI??????
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //?¨???¨?????¤·???????:?¨?????¤·???????256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //???¨??????????MSB??????LSB??????:??????????MSB??????
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC?????????à????
SPI_Init(SPI1, &SPI_InitStructure); //?ù??SPI_InitStruct?????¨???????????????èSPIx?????÷
SPI_Cmd(SPI1, ENABLE); //????SPI???è
// SPIx_ReadWriteByte(0xff);//????????
#endif
OLED_WR_Byte(0xAE,OLED_CMD); //??±?????
OLED_WR_Byte(0xD5,OLED_CMD); //?è???±??·????ò×?,????????
OLED_WR_Byte(80,OLED_CMD); //[3:0],·????ò×?;[7:4],????????
OLED_WR_Byte(0xA8,OLED_CMD); //?è???????·??
OLED_WR_Byte(0X3F,OLED_CMD); //????0X3F(1/64)
OLED_WR_Byte(0xD3,OLED_CMD); //?è??????????
OLED_WR_Byte(0X00,OLED_CMD); //??????0
OLED_WR_Byte(0x40,OLED_CMD); //?è???????????? [5:0],????.
OLED_WR_Byte(0x8D,OLED_CMD); //????±??è??
OLED_WR_Byte(0x14,OLED_CMD); //bit2??????/??±?
OLED_WR_Byte(0x20,OLED_CMD); //?è?????????·????
OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00???????·????;01???????·????;10,?????·????;????10;
OLED_WR_Byte(0xA1,OLED_CMD); //?????¨???è??,bit0:0,0->0;1,0->127;
OLED_WR_Byte(0xC0,OLED_CMD); //?è??COM?¨?è·??ò;bit3:0,???¨????;1,???¨?????? COM[N-1]->COM0;N:?????·??
OLED_WR_Byte(0xDA,OLED_CMD); //?è??COM????????????
OLED_WR_Byte(0x12,OLED_CMD); //[5:4]????
OLED_WR_Byte(0x81,OLED_CMD); //??±????è??
OLED_WR_Byte(0xEF,OLED_CMD); //1~255;????0X7F (?????è??,???ó????)
OLED_WR_Byte(0xD9,OLED_CMD); //?è???¤????????
OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WR_Byte(0xDB,OLED_CMD); //?è??VCOMH ????±???
OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
OLED_WR_Byte(0xA4,OLED_CMD); //????????????;bit0:1,????;0,??±?;(°×??/????)
OLED_WR_Byte(0xA6,OLED_CMD); //?è??????·???;bit0:1,·??à????;0,????????
OLED_WR_Byte(0xAF,OLED_CMD); //????????
OLED_Clear();
} [/mw_shl_code]
这是OLED_INIT();
本人STM32还未入门,可能有非常多的低级错误,希望各位大神指出。不胜感激!另Q523886078,随时可以Q我,讨论。
请各位大神指教!
|