|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
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_t err_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);
- }
复制代码
|
|