打印
[STM32F1]

SPI通讯 读字库芯片

[复制链接]
3138|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题:
1,怎么判断一帧数据接收完成  可以去读SPI->DR来取出数据
2,if(SPI2->SR&0x02)通过判断发送缓冲区为空,再接着发送下一个数据
3,字库芯片GT21L16S2Y数据读出,一个15×16用占32个字节
4,我的程序只能收到前3个字节数据 SPI的RXNE:接收缓冲非空 在接受3个字节后 不再被置1过


沙发
mmuuss586| | 2014-12-3 17:48 | 只看该作者
可能时序要求比较高;
字库还没有返回数据或未收到数据吧;
降低读写速度,读写字节间先加点延时;

实在不行,就先硬件模拟SPI接口吧;

使用特权

评论回复
板凳
仙人球W|  楼主 | 2014-12-5 08:06 | 只看该作者
谢谢版主!
我用软件模拟成功了,硬件还是没有调通。
1,我想知道怎么判断SPI接受完一帧数据,我可以去读SPI->DR来获取这帧数据。

使用特权

评论回复
地板
qq4988| | 2014-12-5 08:39 | 只看该作者
本身硬件SPI挺好用的啊,直接调用SPI的库函数,每次读32字节就OK了

使用特权

评论回复
5
仙人球W|  楼主 | 2014-12-5 09:18 | 只看该作者
mmuuss586 发表于 2014-12-3 17:48
可能时序要求比较高;
字库还没有返回数据或未收到数据吧;
降低读写速度,读写字节间先加点延时;

用SPI中断方式读取字库成功了

使用特权

评论回复
6
仙人球W|  楼主 | 2014-12-5 09:19 | 只看该作者
本帖最后由 仙人球W 于 2014-12-5 09:21 编辑
qq4988 发表于 2014-12-5 08:39
本身硬件SPI挺好用的啊,直接调用SPI的库函数,每次读32字节就OK了

用中断好用了
void SPI2_ExecuteRequest(void)
{
        SPI2->CR2|=(1<<6);  /*使能数据接收完成中断*/
        while((SPI2->SR&0x02)==0);
        SPI2->DR=0x03;
}


void SPI2_IRQHandler(void)
{
         BYTE Temp;
        
        Temp= SPI2->DR;
         if(Stopflag==1)
            {
                     SPIDriver.FontData[SPIDriver.SPIDataCounter++]= Temp;
                     if(SPIDriver.SPIDataCounter>=32)
                     {
                             SPIDriver.SPIDataCounter=0;
                             Stopflag=0;
                             SPI2->CR2&=~(1<<6);
                             FontChipSel_Dis(); //禁止字库片选
                     }
                     else
                            SPI2->DR=0xff; /*发送一个Dummy字节数据以便产生Clock*/
            }
         else if(Stopflag==2)
           {
                     if(SPIDriver.SPIDataCounter>=3) /*三个地址一个Dummy*/
                     {
                              SPI2->DR=0xff; /*发送一个Dummy字节数据以便产生Clock*/
                              Stopflag=1;
                              SPIDriver.SPIDataCounter=0;
                     }
                   else
                             SPI2->DR=SPIDriver.FontChipAddr[SPIDriver.SPIDataCounter++];
           }
}

使用特权

评论回复
7
qq4988| | 2014-12-5 09:33 | 只看该作者
不需要用中断吧,发送地址后,直接接收就可以了

使用特权

评论回复
8
qq4988| | 2014-12-5 09:39 | 只看该作者
/*******************************************************
*  函数名称: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);
}

使用特权

评论回复
9
zxw2de| | 2014-12-5 16:13 | 只看该作者
我也是将字库放在SPIflash中、

使用特权

评论回复
10
仙人球W|  楼主 | 2014-12-6 08:57 | 只看该作者
zxw2de 发表于 2014-12-5 16:13
我也是将字库放在SPIflash中、

用字库芯片 方便很多

使用特权

评论回复
11
仙人球W|  楼主 | 2014-12-6 08:58 | 只看该作者
qq4988 发表于 2014-12-5 09:39
/*******************************************************
*  函数名称:WORDLIB_read_GB_16x16
*  函数 ...

不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

720

帖子

5

粉丝