STM32F030使用硬件SPI与字库芯片通信

前言

在淘宝买了350-019-PC 3.5寸TFT彩屏,卖家提供了DEMO程序是软件模拟SPI的,但这种程序只能用于演示,实际使用其通讯速率远远不能够满足要求。因此在转换为STM32自带的SPI通讯的时候,ST7796S驱动由于是只发送不接受,因此很快就能够调通,但是模块上的字库芯片是就调试了好几天都一直无法调通,网上也查询了很多资料依然无法解决,最后是给询问我同事之后才终于解决,最后才知道我对硬件SPI有有误解才导致了这次的问题,为了让自己长记性,因此写了这个博文。

基本信息

单 片 机: STM32F030C8Tx
通信接口:SPI2
字库芯片:JLX-GB2312-3205

SPI的代码

void SPI2_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef   SPI_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF ;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_Level_3;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_0);GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_0);GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_0);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB, &GPIO_InitStructure);SPI_I2S_DeInit(SPI2); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure);SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF); SPI_Cmd(SPI2, ENABLE);
}void SPI2_WriteByte(uint8_t data)
{while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_SendData8(SPI2, data);
}uint8_t SPI2_ReadByte(void)
{while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);return SPI_ReceiveData8(SPI2);
}
uint8_t SPI2_Transfer(uint8_t data)
{while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_SendData8(SPI2, data);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);return SPI_ReceiveData8(SPI2);
}

字库驱动代码

/****送指令到晶联讯字库IC***/
void send_command_to_ROM( u16 datu )
{#ifdef LCD_USE_HW_SPI//SPI2_WriteByte(datu);SPI2_Transfer(datu);
#else u16 i;for(i=0;i<8;i++ ){if(datu&0x80)ROM_MOSI_Set(); elseROM_MOSI_Clr(); datu = datu<<1;ROM_CLK_Clr();ROM_CLK_Set();}
#endif
}/****从晶联讯字库IC中取汉字或字符数据(1个字节)***/
static u8 get_data_from_ROM(void)
{#ifdef LCD_USE_HW_SPIreturn SPI2_Transfer(0x00);//return    SPI2_ReadByte();
#elseu16 i;u16 ret_data=0;ROM_CLK_Set();for(i=0;i<8;i++){ROM_MISO_Set();ROM_CLK_Clr();ret_data=ret_data<<1;if( ROM_MISO_Get())ret_data=ret_data+1;elseret_data=ret_data+0;ROM_CLK_Set();}return(ret_data);
#endif
}

字库通信代码

void get_and_write_32x32(u32 fontaddr,u16 x,u16 y,u16 font_color,u16 back_color)
{u16 i,j,disp_data;ROM_CS_Clr();send_command_to_ROM(0x03);send_command_to_ROM((fontaddr&0xff0000)>>16);    //地址的高8位,共24位send_command_to_ROM((fontaddr&0xff00)>>8);       //地址的中8位,共24位send_command_to_ROM(fontaddr&0xff);                //地址的低8位,共24位for(j=0;j<32;j++){lcd_address(y,x+j,32,32);    for(i=0;i<4;i++){disp_data=get_data_from_ROM();mono_data_out(disp_data,font_color,back_color);   //这一句相当于写了一行8个像素点的数据。}}ROM_CS_Set();
}

主要问题点:

  1. 可以从上面的代码看到,在通信的过程中,会先发送三个字节的地址,接着就一直读取数据。
  2. 如果字库的读取驱动按照我屏蔽的方式去通信,由于SPI是全双工通信,那么在发送完三个字节的地址数据之后,接着一直调用读取的接口,此时只会读取到一个数据,接着就读取不到数据,则一直会进入到等待数据的死循环中while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET),主要原因是因为调用SPI_ReceiveData8(SPI2)是直接从寄存器中获取数据,此时是不产生时钟信号的,这点就是我一直误解的点,因此想要产生时钟数据则需要每次在读取前发送个0x00数据才能够有时钟信号,进行全双工通信正常获取到数据。

STM32F030使用硬件SPI与字库芯片通信相关推荐

  1. DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信

    本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础. 1. 准备工作 硬件准备 开发板 首先需要准备一个 ...

  2. STM32F030xx硬件SPI调试记录

    笔者最近调试STM32F030F4这颗芯片的硬件SPI,本以为将F103的程序直接移植过去就可以,但是却出了很多问题,故在此记录一下,避免后面再走弯路,顺便也给广大网友做一个前车之鉴. 注意:本文使用 ...

  3. STM32单片机基础17——使用硬件SPI驱动TFT-LCD(ST7789)

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与ST7789通信,驱动16bit TFT-LCD 屏幕. 0. 前言 学习 SPI 外设驱动LCD屏幕没有 ...

  4. 【STM32Cube_17】使用硬件SPI驱动TFT-LCD(ST7789)

    上一篇:[STM32Cube_16]使用硬件CRC校验数据(以SHT30为例) 寻求更好的阅读体验,请移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配置STM ...

  5. 梳理STM32F429之通信传输部分---NO.8 硬件SPI

    目录 一.STM32 的 SPI 特性及架构: 二.SPI 初始化结构体详解: 三.硬件SPI-读写串行 FLASH 实验 一.STM32 的 SPI 特性及架构: 1.引脚简介: (1)   (Sl ...

  6. SPI方式读取汉字字库芯片

    需求: 在液晶屏上显示指定的汉字 方案1:以带有汉字的图片形式显示 否定原因: 1)在画面展示时,会覆盖显示背景,不美观协调 2)需要先由图片格式转换成位图格式,不连贯,不方便 方案2:通过直接读取汉 ...

  7. 有关DSP2812与SPI接口DA芯片的通信(AD5640,AD5682)

    使用DSP2812控制SPI接口DA芯片总结: 本文只针对SPI接口的DA芯片,通常用到的DA芯片有精度位16位/14位/12位的.我在这次过程中用到的都是14位的,刚开始使用的是AD5640的DA芯 ...

  8. STC8单片机硬件SPI通信例程W25Q16

    SPI全双工通信使用起来相当方便,最常见的是W25Q16存储颗粒的使用了,当重新上电时,存储再W25Q16中的数据不会丢失,仍然可以读取出来,下面就简单讲一下如何使用W25Q16存储芯片. 本篇讲的是 ...

  9. STM32F030 HAL库硬件SPI操作W25Q16存储芯片(二)

    上篇文章介绍了W25Q16芯片的一些基本信息,这篇主要介绍编程操作. /*封装读写操作 SPI 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 */ uint8_t SPI_R ...

最新文章

  1. matplotlib tick_params参数刻度线调整
  2. python3小游戏源代码_如何用python3代码玩小游戏?
  3. 图解用MySQL创建进销存数据库
  4. java调用wcf控件的两种交互
  5. mix2s 升级android p,小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?...
  6. linux 文件mtime,linux 文件的atime,ctime,mtime查看與修改
  7. Docker删除某个容器时失败解决方案
  8. 05Vue.js快速入门-Vue实例详解与生命周期
  9. z-blog php 静态设置,Nginx的Z-Blog的伪静态配置方法
  10. 【转】Qt中的QString,QByteArray,Qchar, char*
  11. HTML-DOM零碎
  12. 织梦手机站搜索结果显示为电脑站的搜索结果模板的解决方法
  13. librtmp usage
  14. Fedora 9 Samba 配置
  15. [微信小程序]搜索功能实现,搜索框样式
  16. 2021振兴杯参赛后感(部分writeup)
  17. DP/最短路 URAL 1741 Communication Fiend
  18. linux lxde桌面快捷键,LXde 桌面有两下啊
  19. 日立6TB充氦硬盘详细规格、实物照片
  20. web1.0、web2.0与web3.0

热门文章

  1. 上海车艺尚教你如何DIY原厂8.8寸大屏幕----宝马车友必看
  2. 怎样禁止“Windows - 没有软盘”的提示?
  3. Android ORM框架GreenDao用法
  4. [CF549F/51nod1472]Yura and Developers
  5. 图像标签 链接标签
  6. ReactNative bug:Application has not bean registered.This is either due to require()error dur
  7. Java 实现视频时间维度剪切 | Java工具类
  8. idea中Hierarchy出现在页面右侧
  9. JAVA 间隔 时间 计算器
  10. 修改演武今日可用数据显示