野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23645|回复: 3

STM32的SPI驱如何动12864

[复制链接]
发表于 2014-4-12 23:11:12 | 显示全部楼层 |阅读模式
求救!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

发表于 2014-4-13 08:50:35 | 显示全部楼层
没有提供这方面的例程,就需要你自己编写。
一般你买液晶的时候,卖家也会提供一份资料的,一般是51代码,自己把里面的SPI代码换成STM32的,移植一下就好了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-13 11:33:03 | 显示全部楼层
本帖最后由 罗飞 于 2014-4-13 11:34 编辑
山外メ雲ジ 发表于 2014-4-13 08:50
没有提供这方面的例程,就需要你自己编写。
一般你买液晶的时候,卖家也会提供一份资料的,一般是51代码, ...


#include "stm32f10x.h"

#define IOA     0
#define IOB     1
#define IOC     2
#define IOD     3
#define IOE     4

//LCD_CS  
#define LCD_CS_SET                 GPIO_SetBits(GPIOA, GPIO_Pin_0)
#define LCD_CS_RESET                 GPIO_ResetBits(GPIOA, GPIO_Pin_0)
/***************************************************************
函数名称:  
          void SysTick_ms(u32 tic)
参数:
         
返回值:
         无
功能:
         延时1MS
***************************************************************/
void Delay(u32 tic)
{
       u32 temp;   
       SysTick->LOAD=9000*tic;
       SysTick->VAL=0x00;
       SysTick->CTRL=0x01;
       do
       {
           temp=SysTick->CTRL;
       }
       while((temp&0x01)&&(!(temp&(1<<16))));
       SysTick->CTRL=0x00;
       SysTick->VAL=0x00;
}
/***************************************************************
功能:接口初始化
参数:
         1:选择位口IOA、IOB、IOC、IOD、IOE 、
         2:功能选择
         3:选择段口A.x  B.x   C.x   D.x   E.x
返回值:
       无
举例:
       GPIO_Config(GPIOB,GPIO_Mode_Out_PP,GPIO_Pin_12)
       定义   B - 12  口推挽输出
***************************************************************/
void GPIO_Config(u8 IOx,GPIOMode_TypeDef GPIO_type,u16 Number)  
{
        GPIO_InitTypeDef GPIO_InitStructure;        
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin   = Number;
        GPIO_InitStructure.GPIO_Mode  = GPIO_type;
        switch(IOx)
        {
                case  0:
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                        
                        GPIO_Init(GPIOA, &GPIO_InitStructure);                        
                break;
                case  1:  
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);                              
                        GPIO_Init(GPIOB, &GPIO_InitStructure);
                        
                break;
                case  2:   
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);     
                        GPIO_Init(GPIOC, &GPIO_InitStructure);                        
                break;
                case  3:
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);                                          
                        GPIO_Init(GPIOD, &GPIO_InitStructure);                       
                break;
                case  4:
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);                                   
                        GPIO_Init(GPIOE, &GPIO_InitStructure);                       
                break;
        default:  break;   
        }
}
/***************************************************************
功能:SPI总线初始化
参数:
         1:配置IO口
         2:配置时钟
         3:配置SPI总线
返回值:
       无
举例:
      
***************************************************************/
void SPI_Config()
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  /************************时钟配置******************************/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  /***********************管脚配置********************************/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  //对应的SCK、MOSI为AF引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //液晶初始化I/O口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /************************SPI初始化********************************/
  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_2;//定义波特率预分频的值:波特率预分频值为2
  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);
}


void SPI_SendData(uint8_t byte)
{
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);   
  SPI_I2S_SendData(SPI1, byte);
}

/*****************************************************/

void WriteCommandLCM(u8 WCLCM)
{
   u8 Start_data,Hdata,Ldata;
   Start_data = 0xf8;                     // 写指令 11111000
   Hdata = WCLCM&0xf0;                  // 取高四位   DDDD0000
   Ldata = (WCLCM << 4) & 0xf0;         // 取低四位   0000DDDD
   LCD_CS_SET;
   Delay(1);
   SPI_SendData(Start_data);               // 发送起始信号 第1字节-格式:1111ABC
   SPI_SendData(Hdata);              // 发送高四位   第2字节-格式DDD0000
   SPI_SendData(Ldata);                   // 发送低四位   第3字节-格式:0000DDDD     
   Delay(1);// 延时是必须的
   LCD_CS_RESET;
}
/*****************************************************/

void WriteDataLCM(u8 WDLCM)
{
   u8 Start_data,Hdata,Ldata;

   Start_data = 0xfa;                   // 写数据 11111010
   Hdata = WDLCM & 0xf0;                 // 取高四位   DDDD0000
   Ldata = (WDLCM << 4) & 0xf0;          // 取低四位   0000DDDD
   LCD_CS_SET;
   Delay(1);
   SPI_SendData(Start_data);               // 发送起始信号 第1字节-格式:1111ABC
   SPI_SendData(Hdata);                    // 发送高四位   第2字节-格式DDD0000
   SPI_SendData(Ldata);                     // 发送低四位   第3字节-格式:0000DDDD
   Delay(1);
   LCD_CS_RESET;
}
/*****************************************************/
void Lcdinit(void)   
{
   LCD_CS_RESET;                              // 启动等待,等LCM讲入工作状态   
   Delay(1);
   WriteCommandLCM(0x30);                  // 8 位介面,基本指令集
   Delay(1);
   WriteCommandLCM(0x0c);                  // 显示打开,光标关,反白关
   Delay(1);
   WriteCommandLCM(0x02);                  // 清屏,将DDRAM的地址计数器归零
   Delay(1);
}

void main()
{
   SystemInit();
   
   SPI_Config();

   Lcdinit();

   while(1)
   {
     WriteCommandLCM(0x80);
     WriteDataLCM(0x11);
   }
}






引脚有波形!!!!!!!!  液晶会有乱码!!!!!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2014-4-13 13:59:00 | 显示全部楼层
罗飞 发表于 2014-4-13 11:33
#include "stm32f10x.h"

#define IOA     0

这情况就需要示波器分析一下时序,还有数据,看看通信是否正常。
有波形,但并不代表波形就对的。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 23:06 , Processed in 0.029752 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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