((硬件spi+dma)+模拟spi)驱动LCD5110


#ifndef __spi_dma_h__
#define __spi_dma_h__

#include "stm32f10x.h"

#define buffersize 800
#define SPI1_DR_Addr ( (u32)0x4001300C )

#define SPI_DMA   //开启DMA功能

void SPI1_DMA_Configuration( void );
void SPI1_ReceiveSendByte( u16 num );
 u8 SPI_SendByte(u8 Data);
void SPI_ReadBytes( u8 Addr, u16* Buffer, u8 Len );
void SPI_SendBytes( u8* Buffer, u16 Len);
#endif

#include "spi_dma.h"

 u8 SPI1_TX_Buffer[buffersize];
 u8 SPI1_RX_Buffer[buffersize];

void SPI1_DMA_Configuration( void )
{

   // RCC->AHBENR |= 1<<0 ;                     //DMA1时钟使能
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

    /*------------------配置SPI1_RX_DMA通道Channel2---------------------*/

    DMA1_Channel2->CCR &= ~( 1<<14 ) ;        //非存储到存储器模式
    DMA1_Channel2->CCR |=    2<<12   ;        //通道优先级高
    DMA1_Channel2->CCR &= ~( 3<<10 ) ;        //存储器数据宽度8bit
    DMA1_Channel2->CCR &= ~( 3<<8  ) ;        //外设数据宽度8bit
    DMA1_Channel2->CCR |=    1<<7    ;        //存储器地址增量模式
    DMA1_Channel2->CCR &= ~( 1<<6  ) ;        //不执行外设地址增量模式
    DMA1_Channel2->CCR &= ~( 1<<5  ) ;        //不执行循环操作
    DMA1_Channel2->CCR &= ~( 1<<4  ) ;        //从外设读

    DMA1_Channel2->CNDTR &= 0x0000   ;        //传输数量寄存器清零
    DMA1_Channel2->CNDTR = buffersize ;       //传输数量设置为buffersize个

    DMA1_Channel2->CPAR = SPI1_DR_Addr ;      //设置外设地址,注意PSIZE//spi接收数据的地址
    DMA1_Channel2->CMAR = (u32)SPI1_RX_Buffer ; //设置DMA存储器地址,注意MSIZE//自己想要储存的地址

    /*------------------配置SPI1_TX_DMA通道Channel3---------------------*/

    DMA1_Channel3->CCR &= ~( 1<<14 ) ;         //非存储到存储器模式
    DMA1_Channel3->CCR |=    0<<12   ;        //通道优先级最低
    DMA1_Channel3->CCR &= ~( 3<<10 ) ;         //存储器数据宽度8bit
    DMA1_Channel3->CCR &= ~( 3<<8 )  ;        //外设数据宽度8bit
    DMA1_Channel3->CCR |=    1<<7    ;        //存储器地址增量模式
    DMA1_Channel3->CCR &= ~( 1<<6 )  ;        //不执行外设地址增量模式
    DMA1_Channel3->CCR &= ~( 1<<5 ) ;         //不执行循环操作
    DMA1_Channel3->CCR |=    1<<4    ;        //从存储器读

    DMA1_Channel3->CNDTR &= 0x0000   ;        //传输数量寄存器清零
    DMA1_Channel3->CNDTR = buffersize ;       //传输数量设置为buffersize个

    DMA1_Channel3->CPAR = SPI1_DR_Addr ;      //设置外设地址,注意PSIZE//spi接收数据的地址
    DMA1_Channel3->CMAR = (u32)SPI1_TX_Buffer ; //设置DMA存储器地址,注意MSIZE//自己想要储存的地址



}

void SPI1_ReceiveSendByte( u16 num )
{

SPI_I2S_DMACmd( SPI1, SPI_I2S_DMAReq_Tx, ENABLE);   //使能spi1到dma通道Tx功能
SPI_I2S_DMACmd( SPI1, SPI_I2S_DMAReq_Rx, ENABLE);     //使能spi1到dma通道Rx功能

    DMA1_Channel2->CNDTR = 0x0000   ;           //传输数量寄存器清零
    DMA1_Channel2->CNDTR = num ;         //传输数量设置为buffersize个

    DMA1_Channel3->CNDTR = 0x0000   ;           //传输数量寄存器清零
    DMA1_Channel3->CNDTR = num ;         //传输数量设置为buffersize个

    DMA1->IFCR = 0xF0 ;                         //清除通道2的标志位
    DMA1->IFCR = 0xF00 ;                        //清除通道3的标志位

    SPI1->DR ;                                  //接送前读一次SPI1->DR,保证接收缓冲区为空

    while( ( SPI1->SR & 0x02 ) == 0 );

    DMA1_Channel3->CCR |= 1 << 0 ;              //开启DMA通道3
    DMA1_Channel2->CCR |= 1 << 0 ;              //开启DMA通道2  

    while( ( DMA1->ISR & 0x20 ) == 0 );

    DMA1_Channel3->CCR &= ~( 1 << 0 ) ;         //关闭DMA通道3
    DMA1_Channel2->CCR &= ~( 1 << 0 ) ;         //关闭DMA通道2

}

//SPI发送一个字节
 u8 SPI_SendByte(u8 Data)
{

    #ifndef SPI_DMA

    // Loop while DR register in not emplty
    while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) == RESET ) ;

    // Send byte through the SPI1 peripheral
    SPI_I2S_SendData( SPI1, Data ) ;

    // Wait to receive a byte
    while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) == RESET ) ;

    // Return the byte read from the SPI bus
    return SPI_I2S_ReceiveData( SPI1 ) ;

    #else

    SPI1_TX_Buffer[0] = Data;
    SPI1_ReceiveSendByte(1);

    return (SPI1_RX_Buffer[0]);
    #endif
}

//SPI读取Len字节
void SPI_ReadBytes( u8 Addr, u16* Buffer, u8 Len )
{
    #ifndef SPI_DMA
    if( ( Len > 0x80 ) || ( Len == 0 ) )
        Len = 1 ;
    SPI_SendByte( Len ) ;
    SPI_SendByte( Addr ) ;
    while( Len-- )
        {
            *Buffer = SPI_SendByte( 0xFF ) ;
        Buffer ++ ;
    }
    #else

    u8 i = 0;

    if( ( Len > 0x80 ) || ( Len == 0 ) )
        Len = 1 ;

    SPI1_TX_Buffer[0] = Len;
    SPI1_TX_Buffer[1] = Addr;

    SPI1_ReceiveSendByte(Len + 2);

    for (i = 0;i < Len;i++)
    {
        *Buffer++ = SPI1_RX_Buffer[i + 2];  
    }
    #endif
}
//SPI发送Len字节
//Len   数量个数
//* Buffer  发送的数据

void SPI_SendBytes( u8* Buffer, u16 Len)
{
    #ifndef SPI_DMA
    // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
while(Len--){

    while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) == RESET ) ;
    // Send byte through the SPI1 peripheral
    SPI_I2S_SendData( SPI1, * Buffer ) ;
    // Wait to receive a byte
    while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) == RESET ) ;
    // Return the byte read from the SPI bus
     SPI_I2S_ReceiveData( SPI1 ) ;

    Buffer++;
};

    #else

    SPI1_ReceiveSendByte(Len);

    #endif

}
/*********************** (C) COPYRIGHT 2010 Libraworks *************************
* File Name          : LCD5110_lib.h
* Author             : Libraworks
* Version            : V1.0.0
* Date               : 04/15/2010
* Description        : This file provides the character and font library.
*******************************************************************************/
//-------------------------------------------------------------------\\
//  Nokia5110指令集                                                     \\
//  D7  D6  D5  D4  D3  D2  D1  D0                                   \\
//  0   0   1   0   0   PD  V   H                                    \\
//                      |   |   |_______1->扩展指令集  0->基本指令集 \\
//                      |   |___________1->垂直寻址    0->水平寻址   \\
//                      |_______________1->低功耗模式  0->正常模式    \\
//-------------------------------------------------------------------\\
//  显示模式                                                         \\
//  D7  D6  D5  D4  D3  D2  D1  D0                                   \\
//  0   0   0   0   1   D   0   E                                    \\
//                      |       |_______0    0    1    1             \\
//                      |_______________0    1    0    1             \\
//                                      白屏 正常 全显 反转          \\
//-------------------------------------------------------------------\\

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LCD5110_LIB_H__
#define __LCD5110_LIB_H__

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "spi_dma.h"
/* Exported types ------------------------------------------------------------*/
//枚举 D/C模式选择 
typedef enum
{                                  
    DC_CMD  = 0,    //写命令
    DC_DATA = 1     //写数据       
} DCType;

/* Exported variables --------------------------------------------------------*/
extern vu32 TimingDelay;

/* Exported constants --------------------------------------------------------*/
//宽高像素
#define LCD_X_RES       84
#define LCD_Y_RES       48
#define LCD_CTRL_PORT   GPIOA
#define LCD_RST         GPIO_Pin_1
#define LCD_CE          GPIO_Pin_4
#define LCD_DC          GPIO_Pin_2
//#define LCD_VCC           GPIO_Pin_11
//#define LCD_BGL           GPIO_Pin_3
//#define LCD_GND           GPIO_Pin_1
//config as spi2 
#define LCD_MOSI        GPIO_Pin_7
#define LCD_CLK         GPIO_Pin_5

/* Exported macro ------------------------------------------------------------*/
#define USESPI 1 //使能使用SPI1
#define LCD_RST_H()     GPIO_SetBits(LCD_CTRL_PORT, LCD_RST)
#define LCD_RST_L()     GPIO_ResetBits(LCD_CTRL_PORT, LCD_RST)

#define LCD_CE_H()      GPIO_SetBits(LCD_CTRL_PORT, LCD_CE)
#define LCD_CE_L()      GPIO_ResetBits(LCD_CTRL_PORT, LCD_CE)

#define LCD_DC_DATA()   GPIO_SetBits(LCD_CTRL_PORT, LCD_DC)
#define LCD_DC_CMD()    GPIO_ResetBits(LCD_CTRL_PORT, LCD_DC)

#define LCD_MOSI_H()    GPIO_SetBits(LCD_CTRL_PORT, LCD_MOSI)
#define LCD_MOSI_L()    GPIO_ResetBits(LCD_CTRL_PORT, LCD_MOSI)
#define LCD_CLK_H()     GPIO_SetBits(LCD_CTRL_PORT, LCD_CLK)
#define LCD_CLK_L()     GPIO_ResetBits(LCD_CTRL_PORT, LCD_CLK)
//#define LCD_VCC_H()       GPIO_SetBits(LCD_CTRL_PORT, LCD_VCC)
//#define   LCD_BGL_H()     GPIO_SetBits(LCD_CTRL_PORT, LCD_BGL)
//#define LCD_GND_L()       GPIO_ResetBits(LCD_CTRL_PORT, LCD_GND)

/* Exported functions ------------------------------------------------------- */
void LCD_Init(void);
void LCD_Clear(void);
void LCD_SetXY(u8 X, u8 Y);
void LCD_SetContrast(u8 contrast);
void LCD_Send(u8 data, DCType dc);
void LCD_Write_Char(u8 ascii);
void LCD_Write_EnStr(u8 X, u8 Y, u8* s);
void LCD_Write_ChStr(u8 X, u8 Y, u8 num);
void Wait_ms(u32 nTime);
//void TimingDelay_Decrement(void);
void DMA_Configuration(void);
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);
void  SPI_Configuration(void);
void LCD_GPIO_Configuration(void);
void LCD_AutoLine_Entry(u8 X,u8 Y,u8* s,u16 Len);
#endif

/*********************** (C) COPYRIGHT 2010 Libraworks ************************/
/*********************** (C) COPYRIGHT 2010 Libraworks *************************
* File Name          : LCD5110_lib.c
* Author             : Libraworks
* Version            : V1.0.0
* Date               : 04/17/2010
* Description        : This file provides the character and font library.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "LCD5110_lib.h"

/* Private typedef -----------------------------------------------------------*/
    DMA_InitTypeDef DMA_initstructure;
SPI_InitTypeDef SPI_InitStructure;
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
 extern u8 SPI1_TX_Buffer[buffersize];
extern u8 SPI1_RX_Buffer[buffersize];
 u8 Stry_Len=0;

//6行14个字符
        /***********************************************************
                >>>>>    chahracter index   <<<<<
              (0)  !(1)  "(2)  #(3)  $(4)  %(5)  &(6)  '(7)
             ((8)  )(9)  *(10) +(11) ,(12) -(13) .(14) /(15)
             0(16) 1(17) 2(18) 3(19) 4(20) 5(21) 6(22) 7(23)
             8(24) 9(25) :(26) ;(27) <(28) =(29) >(30) ?(31)
             @(32) A(33) B(34) C(35) D(36) E(37) F(38) G(39)
             H(40) I(41) J(42) K(43) L(44) M(45) N(46) O(47)
             P(48) Q(49) R(50) S(51) T(52) U(53) V(54) W(55)
             X(56) Y(57) Z(58) [(59) \(60) ](61) ^(62) _(63)
             `(64) a(65) b(66) c(67) d(68) e(69) f(70) g(71)
             h(72) i(73) j(74) k(75) l(76) m(77) n(78) o(79)
             p(80) q(81) r(82) s(83) t(84) u(85) v(86) w(87)
             x(88) y(89) z(90) {(91) |(92) }(93) ~(94) 
            //Font: Fixedsys
            //取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
            //查表方法: 要显示的ASCII码-32就可以得到字库码的指针
        ***********************************************************/
const unsigned char Font_code[][16] =
{
    {
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},// 0
    {
  0x00,0x00,0x70,0xF8,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00},//!1
    {
  0x00,0x38,0x38,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//"2
    {
  0x00,0x20,0xF8,0xF8,0x20,0xF8,0xF8,0x20,0x00,0x02,0x0F,0x0F,0x02,0x0F,0x0F,0x02},//#3
    {
  0x00,0x30,0x78,0xCE,0x8E,0x18,0x10,0x00,0x00,0x04,0x0C,0x38,0x39,0x0F,0x06,0x00},//$4
    {
  0x18,0x3C,0x24,0xBC,0xD8,0x60,0x30,0x00,0x00,0x06,0x03,0x0D,0x1E,0x12,0x1E,0x0C},//%5
    {
  0x00,0xB0,0xF8,0x48,0x78,0x30,0x00,0x00,0x00,0x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值