2465|0

1万

帖子

16

TA的资源

版主

楼主
 

MM32F031开发板评测10:硬件驱动SPI [复制链接]

今天搞硬件驱动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. }
复制代码



以下是运行时的照片:


此帖出自电机控制论坛
点赞 关注
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表