Lawrence 发表于 2014-6-26 13:19:46

使用STM32F103VB芯片SPI控制器读取字库芯片GT30L32S4W

spi1.h文件

#include "stm32f10x.h"
#include "delay.h"

#ifndef        __SPI1__H_
#define __SPI1__H_

//MISO(MOSI),M是主控CPU,S是SPI字库芯片
#define SPI1_CS_ON()        (GPIO_SetBits(GPIOA, GPIO_Pin_4))                                //拉高
#define SPI1_CS_OFF()        (GPIO_ResetBits(GPIOA, GPIO_Pin_4))                                //拉低

#define SPI1_CLEAR()        (SPI1_CS_ON())                                                                         //清除总线:禁止片选CS;SPI_CPOL_High已将SCLK空闲时设置为高电平

/*******************************************************
*函数名称:SPI1_init
*函数功能:初始化SPI1(驱动字库芯片的SPI控制器)
*入口参数:无
*出口参数:无
******************************************************/
void SPI1_init(void);

/*******************************************************
*函数名称:spi_read_write_byte
*函数功能:
*入口参数:无
*出口参数:unsigned char
******************************************************/
uint8_t spi_read_write_byte(uint8_t dat);

/*******************************************************
*函数名称:SPI1_setSpeed
*函数功能:设置spi的速度,在通讯过程中是不能修改spi速度的,此函数不适用于I2S
*入口参数:: SPI_BaudRatePrescaler_2                2分频
                          : SPI_BaudRatePrescaler_4           4分频
                          : SPI_BaudRatePrescaler_8           8分频
                          : SPI_BaudRatePrescaler_16        16分频
                          : SPI_BaudRatePrescaler_32        32分频
                          : SPI_BaudRatePrescaler_64        64分频
                          : SPI_BaudRatePrescaler_128         128分频
                          : SPI_BaudRatePrescaler_256         256分频                                  
*出口参数:无
******************************************************/
void SPI1_setSpeed(SPI_TypeDef* SPIx, uint8_t SPI_BaudRatePrescaler);




#endif        /* end of file */





spi1.c文件

#include "spi1.h"

/*******************************************************
*函数名称:SPI1_init
*函数功能:初始化SPI1(驱动字库芯片的SPI控制器)
*入口参数:无
*出口参数:无
******************************************************/
void SPI1_init(void)
{
        SPI_InitTypeDef                SPI_InitStructure;
        GPIO_InitTypeDef         GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
        // spi1 gpio configuration
        // SCK - PA.5        MISO - PA.6                MOSI - PA.7
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF_PP;                                        //推挽复用输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);

<span style="line-height: 1.5;">// CS - PA.4</span>
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_Out_PP;                                        //普通推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);   
       
        SPI1_CS_ON();                                                                                                                //禁止片选

        // spi1 disable
        SPI_Cmd(SPI1, DISABLE);
       
        // spi1 configuration
        SPI_InitStructure.SPI_Direction                 = SPI_Direction_2Lines_FullDuplex;        // 双线双线全双工
        SPI_InitStructure.SPI_Mode                                 = SPI_Mode_Master;                                        // 主机模式
        SPI_InitStructure.SPI_DataSize                         = SPI_DataSize_8b;                                        // 数据帧 8bit
        SPI_InitStructure.SPI_CPOL                                 = SPI_CPOL_High;                                        // 通信空闲时,sck为高电平
        SPI_InitStructure.SPI_CPHA                                 = SPI_CPHA_2Edge;                                        // 偶数边沿(上升沿)采集数据(字库芯片或者SPI_flash的MOSI引脚是在上升沿锁存数据)       
        SPI_InitStructure.SPI_NSS                                = SPI_NSS_Soft;                                                // 软件控制片选
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                // 波特率 Fpclk的256分频
        SPI_InitStructure.SPI_FirstBit                         = SPI_FirstBit_MSB;                                        // 高位数据在前
        SPI_InitStructure.SPI_CRCPolynomial         = 7;                                                                // CRC校验多项式(本工程没用到)
        SPI_Init(SPI1, &SPI_InitStructure);
       
        // spi1 enable
        SPI_Cmd(SPI1, ENABLE);

    return ;
}

/*******************************************************
*函数名称:SPI1_setSpeed
*函数功能:设置spi的速度,在通讯过程中是不能修改spi速度的,此函数不适用于I2S
*入口参数:: SPI_BaudRatePrescaler_2                2分频
                          : SPI_BaudRatePrescaler_4           4分频
                          : SPI_BaudRatePrescaler_8           8分频
                          : SPI_BaudRatePrescaler_16        16分频
                          : SPI_BaudRatePrescaler_32        32分频
                          : SPI_BaudRatePrescaler_64        64分频
                          : SPI_BaudRatePrescaler_128         128分频
                          : SPI_BaudRatePrescaler_256         256分频                                  
*出口参数:无
******************************************************/
void SPI1_setSpeed(SPI_TypeDef* SPIx, uint8_t SPI_BaudRatePrescaler)
{
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));

        //修改SPI速度前先关闭SPI
        while(RESET != SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY));                //检测SPI是否忙
        SPI_Cmd(SPIx, DISABLE);                                                                       
   
    SPIx->CR1   &= 0xFFC7;
    SPIx->CR1   |= SPI_BaudRatePrescaler;
   
    SPI_Cmd(SPIx, ENABLE);
   
    return ;
}

/*******************************************************
*函数名称:spi_read_write_byte
*函数功能:向SPI1写入一个字节数据,同时读取出一个字节数据
*入口参数:dat,写入的数据
*出口参数:unsigned char
******************************************************/
uint8_t spi_read_write_byte(uint8_t dat)
{
        /*
        **在双线全双工模式下,必须一边写发送缓冲区,一边读接收缓冲区,
        **否则在多次发送之后,接收缓冲区和接收移位寄存器中会积压到两个字节的
        **待读取数据,影响下次的读操作。
        */
   
        uint8_terr_cnt = 0;
   
    while(RESET == SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE))       // 发送缓存空标志位
    {
      err_cnt++;
      if(err_cnt > 200)
      {
            return(0);
      }
    }
   
    SPI_I2S_SendData(SPI1, dat);

    err_cnt        = 0;
    while(RESET == SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE))      // 接收缓存非空标志位
    {
      err_cnt++;
      if(err_cnt > 200)
      {
            return(0);
      }
    }
   
    return(SPI_I2S_ReceiveData(SPI1));
}


字库芯片驱动程序wordlib.h

#include "stm32f10x.h"
#include "delay.h"
#include "spi0.h"
#include "spi1.h"

#ifndef        __WORDLIB__H_
#define __WORDLIB__H_


//指令表
#define CMD_READ_WORDLIB                (0x03)                                                                                //读取数据命令
#define CMD_FASTREAD_WORDLIB        (0x0B)                                                                                //快速读取数据命令
#define CMD_DUMMY                                (0xFF)                                                                          //空指令、假数据

<span style="line-height: 1.5;">//使用SPI控制器</span>
#define SPI_INIT()                (SPI1_init())
#define SPI_CLEAR()                (SPI1_CLEAR())
#define SPI_CS_ON()                (SPI1_CS_ON())
#define SPI_CS_OFF()        (SPI1_CS_OFF())
#define SPI_WRITE_BYTE(dat)                (spi_read_write_byte((dat)))
#define SPI_READ_BYTE()                        (spi_read_write_byte(CMD_DUMMY))


/*===============================================ASCII取码(非扩展等宽字符)==============================================*/
/*******************************************************
*函数名称:WORDLIB_read_ASCII_5x7
*函数功能:读取字库芯片中一个ASCII字符的5x7点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于8个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_5x7(uint16_t ASCIICode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_ASCII_7x8
*函数功能:读取字库芯片中一个ASCII字符的7x8点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于8个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_7x8(uint16_t ASCIICode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_ASCII_6x12
*函数功能:读取字库芯片中一个ASCII字符的6x12点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于12个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_6x12(uint16_t ASCIICode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_ASCII_8x16
*函数功能:读取字库芯片中一个ASCII字符的8x16点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于16个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_8x16(uint16_t ASCIICode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_ASCII_12x24
*函数功能:读取字库芯片中一个ASCII字符的12x24点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于48个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_12x24(uint16_t ASCIICode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_ASCII_16x32
*函数功能:读取字库芯片中一个ASCII字符的16x32点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于64个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_16x32(uint16_t ASCIICode, uint8_t *buffer);




/*===============================================国标汉字取码(非扩展等宽字符)===========================================*/
/*******************************************************
*函数名称:WORDLIB_read_GB_12x12
*函数功能:读取字库芯片中一个国标汉字的12x12点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于24个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_12x12(uint16_t GBCode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_GB_16x16
*函数功能:读取字库芯片中一个国标汉字的16x16点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于32个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_16x16(uint16_t GBCode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_GB_24x24
*函数功能:读取字库芯片中一个国标汉字的24x24点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于72个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_24x24(uint16_t GBCode, uint8_t *buffer);

/*******************************************************
*函数名称:WORDLIB_read_GB_32x32
*函数功能:读取字库芯片中一个国标汉字的32x32点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer的大小必须是128个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_32x32(uint16_t GBCode, uint8_t *buffer);




#endif        /* end of file */



字库芯片驱动程序wordlib.c

#include "wordlib.h"

/*===============================================ASCII取码(非扩展等宽字符)==============================================*/
/*******************************************************
*函数名称:WORDLIB_read_ASCII_5x7
*函数功能:读取字库芯片中一个ASCII字符的5x7点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于8个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_5x7(uint16_t ASCIICode, uint8_t *buffer)
{
        uint32_t BaseAddr        = 0x1DDF80;                                                                                //5x7点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint32_t WordAddr        = 0;                                                                                        //ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 8;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((ASCIICode >= 0x20) && (ASCIICode <= 0x7E))
        {
                WordAddr        = (ASCIICode - 0x20) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_ASCII_7x8
*函数功能:读取字库芯片中一个ASCII字符的7x8点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于8个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_7x8(uint16_t ASCIICode, uint8_t *buffer)
{

        uint32_t BaseAddr        = 0x1DE280;                                                                                //7x8点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint32_t WordAddr        = 0;                                                                                        //ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 8;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((ASCIICode >= 0x20) && (ASCIICode <= 0x7E))
        {
                WordAddr        = (ASCIICode - 0x20) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_ASCII_6x12
*函数功能:读取字库芯片中一个ASCII字符的6x12点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于12个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_6x12(uint16_t ASCIICode, uint8_t *buffer)
{

        uint32_t BaseAddr        = 0x1DBE00;                                                                                //6x12点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint32_t WordAddr        = 0;                                                                                        //ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 12;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((ASCIICode >= 0x20) && (ASCIICode <= 0x7E))
        {
                WordAddr        = (ASCIICode - 0x20) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_ASCII_8x16
*函数功能:读取字库芯片中一个ASCII字符的8x16点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于16个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_8x16(uint16_t ASCIICode, uint8_t *buffer)
{

        uint32_t BaseAddr        = 0x1DD780;                                                                                //8x16点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint32_t WordAddr        = 0;                                                                                        //ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 16;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((ASCIICode >= 0x20) && (ASCIICode <= 0x7E))
        {
                WordAddr        = (ASCIICode - 0x20) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_ASCII_12x24
*函数功能:读取字库芯片中一个ASCII字符的12x24点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于48个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_12x24(uint16_t ASCIICode, uint8_t *buffer)
{
        uint32_t BaseAddr        = 0x1DFF00;                                                                                //12x24点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint32_t WordAddr        = 0;                                                                                        //ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 48;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((ASCIICode >= 0x20) && (ASCIICode <= 0x7E))
        {
                WordAddr        = (ASCIICode - 0x20) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_ASCII_16x32
*函数功能:读取字库芯片中一个ASCII字符的16x32点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于64个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_16x32(uint16_t ASCIICode, uint8_t *buffer)
{
        uint32_t BaseAddr        = 0x1E5A50;                                                                                //16x32点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint32_t WordAddr        = 0;                                                                                        //ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 64;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((ASCIICode >= 0x20) && (ASCIICode <= 0x7E))
        {
                WordAddr        = (ASCIICode - 0x20) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}


/*===============================================国标汉字取码(非扩展等宽字符)===========================================*/
/*******************************************************
*函数名称:WORDLIB_read_GB_12x12
*函数功能:读取字库芯片中一个国标汉字的12x12点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于24个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_12x12(uint16_t GBCode, uint8_t *buffer)
{
        uint32_t BaseAddr        = 0;                                                                                        //12x12点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint8_t GBCode_MSB        = (GBCode >> 8) & 0xFF;                                                        //汉字内码的高八位
        uint8_t GBCode_LSB        = GBCode & 0xFF;                                                                //汉字内码的低八位
        uint32_t WordAddr        = 0;                                                                                        //汉字点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 24;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((GBCode_MSB >= 0xA1) && (GBCode_MSB <= 0xA3) && (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xA1) * 94 + (GBCode_LSB - 0xA1)) * BUFSIZE + BaseAddr;
        }
        else if((GBCode_MSB == 0xA9) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = (282 + (GBCode_LSB - 0xA1)) * BUFSIZE + BaseAddr;
        }
        else if((GBCode_MSB >= 0xB0) && (GBCode_MSB <= 0xF7) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xB0) * 94 + (GBCode_LSB - 0xA1) + 846) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_GB_16x16
*函数功能:读取字库芯片中一个国标汉字的16x16点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于32个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_16x16(uint16_t GBCode, uint8_t *buffer)
{
        uint32_t BaseAddr        = 0x2C9D0;                                                                                //16x16点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint8_t GBCode_MSB        = (GBCode >> 8) & 0xFF;                                                        //汉字内码的高八位
        uint8_t GBCode_LSB        = GBCode & 0xFF;                                                                //汉字内码的低八位
        uint32_t WordAddr        = 0;                                                                                        //汉字或者ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 32;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((GBCode_MSB >= 0xA4) && (GBCode_MSB <= 0xA8) && (GBCode_LSB >= 0xA1))
        {
                WordAddr        = BaseAddr;
        }
        else if((GBCode_MSB >= 0xA1) && (GBCode_MSB <= 0xA9) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xA1) * 94 + (GBCode_LSB - 0xA1)) * BUFSIZE + BaseAddr;
        }
        else if((GBCode_MSB >= 0xB0) && (GBCode_MSB <= 0xF7) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xB0) * 94 + (GBCode_LSB - 0xA1) + 846) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_GB_24x24
*函数功能:读取字库芯片中一个国标汉字的24x24点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于72个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_24x24(uint16_t GBCode, uint8_t *buffer)
{

        uint32_t BaseAddr        = 0x68190;                                                                                //24x24点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint8_t GBCode_MSB        = (GBCode >> 8) & 0xFF;                                                        //汉字内码的高八位
        uint8_t GBCode_LSB        = GBCode & 0xFF;                                                                //汉字内码的低八位
        uint32_t WordAddr        = 0;                                                                                        //汉字或者ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 72;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((GBCode_MSB >= 0xA4) && (GBCode_MSB <= 0xA8) && (GBCode_LSB >= 0xA1))
        {
                WordAddr        = BaseAddr;
        }
        else if((GBCode_MSB >= 0xA1) && (GBCode_MSB <= 0xA9) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xA1) * 94 + (GBCode_LSB - 0xA1)) * BUFSIZE + BaseAddr;
        }
        else if((GBCode_MSB >= 0xB0) && (GBCode_MSB <= 0xF7) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xB0) * 94 + (GBCode_LSB - 0xA1) + 846) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte
        //delay_nop(10);
        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}

/*******************************************************
*函数名称:WORDLIB_read_GB_32x32
*函数功能:读取字库芯片中一个国标汉字的32x32点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
                                buffer必须大于等于128个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_32x32(uint16_t GBCode, uint8_t *buffer)
{
        uint32_t BaseAddr        = 0xEDF00;                                                                                //32x32点阵的起始地址,见手册《GT23L32S4W用户手册》
        uint8_t GBCode_MSB        = (GBCode >> 8) & 0xFF;                                                        //汉字内码的高八位
        uint8_t GBCode_LSB        = GBCode & 0xFF;                                                                //汉字内码的低八位
        uint32_t WordAddr        = 0;                                                                                        //汉字或者ASCII字符点阵在芯片中的字节地址
        const uint32_t BUFSIZE        = 128;                                                                                //缓冲区的大小
        uint8_t        i;

        //计算地址,见手册《GT23L32S4W用户手册》
        if((GBCode_MSB >= 0xA4) && (GBCode_MSB <= 0xA8) && (GBCode_LSB >= 0xA1))
        {
                WordAddr        = BaseAddr;
        }
        else if((GBCode_MSB >= 0xA1) && (GBCode_MSB <= 0xA9) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xA1) * 94 + (GBCode_LSB - 0xA1)) * BUFSIZE + BaseAddr;
        }
        else if((GBCode_MSB >= 0xB0) && (GBCode_MSB <= 0xF7) &&        (GBCode_LSB >= 0xA1))
        {
                WordAddr        = ((GBCode_MSB - 0xB0) * 94 + (GBCode_LSB - 0xA1) + 846) * BUFSIZE + BaseAddr;
        }

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
       
        //开始快速读取点阵数据:Read Data Bytes At Higher Speed
        SPI_CS_OFF();
        delay_nop(10);
       
        SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB);                                                                //发送命令字:0x0B
        SPI_WRITE_BYTE((WordAddr >> 16) & 0xff);                                                        //从高到低,依次发送三个字节的地址
        SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
        SPI_WRITE_BYTE(WordAddr & 0xff);
        SPI_WRITE_BYTE(CMD_DUMMY);                                                                                        //最后发送一个字节的假数据 Dummy Byte

        for(i = 0; i < BUFSIZE; i++)
        {
                *(buffer + i)        = SPI_READ_BYTE();                                                                //读取字库芯片发送过来的点阵编码
        }

        SPI_CS_ON();                                                                                                                 //CS置高,结束本次操作
        delay_nop(10);

        SPI_CLEAR();                                                                                                                //清除SPI总线
        delay_nop(10);
}





页: [1]
查看完整版本: 使用STM32F103VB芯片SPI控制器读取字库芯片GT30L32S4W