社区导航

 
查看: 102|回复: 0

[原创] MM32F031开发板评测10:硬件驱动SPI

[复制链接]

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-8 20:24:14 | 显示全部楼层 |阅读模式
今天搞硬件驱动SPI,本来是试一试,因为星期天搞了没有搞定。只是试一试看。
加上前几天的模拟SPI也许有点底吧。这次一下子搞定了,
首先用,例程上的SPI初始化
  1. void SPIM_Init(unsigned short spi_baud_div)
  2. {
  3.     SPI_InitTypeDef SPI_InitStructure;
  4.     GPIO_InitTypeDef  GPIO_InitStructure;
  5.    
  6.    
  7.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);  //SPI2 clk enable
  8.     SPIM_CSHigh();
  9.    
  10.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);
  11.    
  12.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;                   //spi2_cs  pb12
  13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         // íÆÃa¸′óÃêä3ö
  15.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  16.    
  17.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;                   //spi2_sck  pb13
  18.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // íÆÃa¸′óÃêä3ö
  20.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  21.    
  22.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;                   //spi2_mosi  pb15
  23.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // íÆÃa¸′óÃêä3ö
  25.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  26.    
  27.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14;                  //spi2_miso  pb14
  28.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  29.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                 //éÏà-êäèë   
  30.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  31.    
  32.                 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11|GPIO_Pin_12;                   //PA11 RS PA12 REST
  33.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         // íÆÃa¸′óÃêä3ö
  35.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  36.                
  37.                
  38.     GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_0);//Dèòa½«SPIμÄÆäËû¼¸¸öIO¿ú¸′óÃ3éèÎòa±eμÄ£¨Ä¬èÏêÇAF0£©
  39.     GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_0);
  40.     GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_0);
  41.    
  42.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  43.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  44.     SPI_InitStructure.SPI_DataWidth = SPI_DataWidth_8b;
  45.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                            // mode0 SPI_CPOL_Low, SPI_CPHA_1Edge;
  46.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                          // mode3 SPI_CPOL_High,SPI_CPHA_2Edge
  47.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  48.     SPI_InitStructure.SPI_BaudRatePrescaler = spi_baud_div;
  49.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  50.     SPI_Init(SPI2, &SPI_InitStructure);
  51.     SPIM_TXEn();
  52.     SPIM_RXEn();        
  53.     SPI_Cmd(SPI2, ENABLE); //Enables the specified SPI peripheral SPIê1Äü¡¢Ö÷»úÄ£ê½ 8λêy¾YÄ£ê½ SPI μÄ2¨ìØÂê
  54.     GPIO_SetBits(GPIOA,GPIO_Pin_11);
  55. }
复制代码




然后,用两条线控制RS和REST
我定义的是PA11,PA12
当然初始化时得使能PA口时钟,并定义为输出

  1. void LCD_RST_CLR(void)
  2. {
  3.     GPIO_ResetBits(GPIOA,GPIO_Pin_12);
  4. }
  5. void LCD_RST_SET(void)
  6. {
  7.     GPIO_SetBits(GPIOA,GPIO_Pin_12);
  8. }
  9. void LCD_RS_CLR(void)
  10. {
  11.     GPIO_ResetBits(GPIOA,GPIO_Pin_11);
  12. }
  13. void LCD_RS_SET(void)
  14. {
  15.     GPIO_SetBits(GPIOA,GPIO_Pin_11);
  16. }
复制代码





然后在基本函数中加入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通讯为硬件:

  1. unsigned int SPIMReadWriteByte(unsigned char tx_data)
  2. {
  3.     SPI_SendData(SPI2, tx_data);        
  4.     while (1)
  5.     {
  6.         if(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXAVL))        
  7.         {
  8.             return SPI_ReceiveData(SPI2);
  9.         }
  10.     }
  11. }
复制代码



在主函数只是清屏为蓝色:
  1. int main(void)
  2. {
  3.     delay_init();
  4.     uart_initwBaudRate(115200);                         //′®¿ú3õê¼»ˉÎa115200
  5.     SPIM_Init(8);
  6.           Lcd_Init();
  7.     Lcd_Clear(BLUE);        
  8.     while(1)                              //ÎTÏTÑ-»·
  9.     {
  10.         
  11.     }
  12. }
复制代码



以下是运行时的照片:
IMG_20181108_195024.jpg

http://shop34182318.taobao.com/


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-11-19 18:01 , Processed in 0.058774 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表