今天搞硬件驱动SPI,本来是试一试,因为星期天搞了没有搞定。只是试一试看。
加上前几天的模拟SPI也许有点底吧。这次一下子搞定了,
首先用,例程上的SPI初始化
- void SPIM_Init(unsigned short spi_baud_div)
- {
- SPI_InitTypeDef SPI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
-
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //SPI2 clk enable
- SPIM_CSHigh();
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //spi2_cs pb12
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // íÆÃa¸′óÃêä3ö
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //spi2_sck pb13
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // íÆÃa¸′óÃêä3ö
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //spi2_mosi pb15
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // íÆÃa¸′óÃêä3ö
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //spi2_miso pb14
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //éÏà-êäèë
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; //PA11 RS PA12 REST
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // íÆÃa¸′óÃêä3ö
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
-
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_0);//Dèòa½«SPIμÄÆäËû¼¸¸öIO¿ú¸′óÃ3éèÎòa±eμÄ£¨Ä¬èÏêÇAF0£©
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_0);
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_0);
-
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
- SPI_InitStructure.SPI_DataWidth = SPI_DataWidth_8b;
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // mode0 SPI_CPOL_Low, SPI_CPHA_1Edge;
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // mode3 SPI_CPOL_High,SPI_CPHA_2Edge
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
- SPI_InitStructure.SPI_BaudRatePrescaler = spi_baud_div;
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
- SPI_Init(SPI2, &SPI_InitStructure);
- SPIM_TXEn();
- SPIM_RXEn();
- SPI_Cmd(SPI2, ENABLE); //Enables the specified SPI peripheral SPIê1Äü¡¢Ö÷»úÄ£ê½ 8λêy¾YÄ£ê½ SPI μÄ2¨ìØÂê
- GPIO_SetBits(GPIOA,GPIO_Pin_11);
- }
复制代码
然后,用两条线控制RS和REST
我定义的是PA11,PA12
当然初始化时得使能PA口时钟,并定义为输出
- void LCD_RST_CLR(void)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_12);
- }
- void LCD_RST_SET(void)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_12);
- }
- void LCD_RS_CLR(void)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_11);
- }
- void LCD_RS_SET(void)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_11);
- }
复制代码
然后在基本函数中加入RS函数
void Lcd_WriteIndex(u8 Index)
{
LCD_RS_CLR();
SPIMReadWriteByte(Index);
}
void Lcd_WriteData(u8 Data)
{
//LCD_CS_CLR();
LCD_RS_SET();
SPIMReadWriteByte(Data);
///LCD_CS_SET();
}
void Lcd_WriteData_16Bit(u16 Data)
{
Lcd_WriteData(Data>>8);
Lcd_WriteData(Data);
}
void LCD_WriteReg(u8 Index,u16 Data)
{
Lcd_WriteIndex(Index);
Lcd_WriteData_16Bit(Data);
}
void Lcd_Reset(void)
{
LCD_RST_CLR();
delay_ms(100);
LCD_RST_SET();
delay_ms(50);
}[/code]
而SPI通讯为硬件:
- unsigned int SPIMReadWriteByte(unsigned char tx_data)
- {
- SPI_SendData(SPI2, tx_data);
- while (1)
- {
- if(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXAVL))
- {
- return SPI_ReceiveData(SPI2);
- }
- }
- }
复制代码
在主函数只是清屏为蓝色:
- int main(void)
- {
- delay_init();
- uart_initwBaudRate(115200); //′®¿ú3õê¼»ˉÎa115200
- SPIM_Init(8);
- Lcd_Init();
- Lcd_Clear(BLUE);
- while(1) //ÎTÏTÑ-»·
- {
-
- }
- }
复制代码
以下是运行时的照片: