stm32之TFT触摸屏(ILI9320)(2):由触摸屏写入EEPROM

发布者:dong125612最新更新时间:2018-10-16 来源: eefocus关键字:stm32  TFT触摸屏  写入EEPROM 手机看文章 扫描二维码
随时随地手机看文章

    程序来源是电阻触摸屏的触摸显示实验。TFT触摸屏呢,不仅仅是ILI9320这一个芯片,还涉及到两个,一个是ADS7846,一个是AT24CXX。这两个都分别是什么东西呢,ADS7846是TFT控制器,它的主要作用就是在按压之后,把这个值通过ADC进行模数转换,这个控制器是TFT屏幕必备的,当然可以有很多型号,这个ADS7846只是其中一种;这个AT24CXX则是EEPROM,XX不是真的字母X,而是省略了数字,比如AT24C02,这个是个2K的EEPROM,我们这里用的也是这款,它能干什么呢,存储数据,通过ADC得到的值需要变换为屏幕坐标什么的,这个EEPROM就可以存储这个基准值。

    ADS7846的操作是通过SPI进行的,之前讲SPI移植的时候实际讲的比较透彻了,操作也比较简单,看下程序就能懂了。AT24CXX则是通过IIC进行的,所以讲下。

    SPI和IIC有什么不同呢,我的感觉主要是三点:1.二者的协议方式不同,就是起始结束数据接收什么的这是不同的。2.IIC是单向的,同一时刻只能有一个方向,而SPI由于有MOSI和MISO两个线,所以是双工的,而且IIC还有设备地址这种机制,可以当总线。3.二者的速度差别也很大,SPI的速度要比IIC快很多。

    stm32的数据手册中详细介绍了SPI和IIC的各种模式以及寄存器,但是实际操作的时候不需要那么麻烦,因为那个是硬件SPI和硬件IIC,我们在正常使用的使用模拟SPI和模拟IIC就好,方便快捷。

    首先讲下最简单的IIC协议:

    1.在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件:当SCL保持“高”时,SDA由“高”变为“低”为开始条件;当SCL保持“高”且SDA由“低”变为“高”时为停止条件。开始和停止条件均由主控制器产生。数据传送具有应答是必须的。

    2.与应答对应的时钟脉冲由主控制器产生,发送器在应答期间必须下拉SDA线。当寻址的被控器件不能应答时,数据保持为高并使主控器产生停止条件而终止传输。在传输的过程中,在用到主控接收器的情况下,主控接收器必须发出一数据结束信号给被控发送器,从而使被控发送器释放数据线,以允许主控器产生停止条件。

    3.I2C总线在开始条件后的首字节决定哪个被控器将被主控器选择,例外的是“通用访问”地址,它可以在所有期间寻址。当主控器输出一地址时,系统中的每一器件都将开始条件后的前7位地址和自己的地址进行比较。如果相同,该器件即认为自己被主控器寻址,而作为被控接收器或被控发送器则取决于R/W位。

    有上面这三点的知识就足够操作模拟IIC了

    再看下EEPROM的硬件连接,在使用板子的数据手册里,如下图

stm32之TFT触摸屏(ILI9320)(2):由触摸屏写入EEPROM(AT24CXX)谈IIC的使用

    可以看到,IIC的时钟和数据引脚PB10和PB11,这里在使用的时候是需要对引脚进行初始化的。看下IIC写数据的函数就应该一目了然了。

void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)

{          

    IIC_Start();  

if(EE_TYPE>AT24C16)

{

IIC_Send_Byte(0XA0);  

IIC_Wait_Ack();

  }else

{

IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));  

}  

    IIC_Send_Byte(WriteAddr%6);   

IIC_Wait_Ack();     

IIC_Send_Byte(DataToWrite);       

IIC_Wait_Ack();         

        IIC_Stop();

delay_ms(10);  

}

    IIC_Start()的作用, IIC_SDA=1,这里是PB11拉高,IIC_SCL=1,这里是PB10拉高,延时后IIC_SDA=0;,说明在时钟线为高,SDA由高变为低,即为开始条件,接着IIC_SCL=0,即时钟线拉低,准备发送或接收数据。

    通过IIC_Send_Byte进行指令的写入,每一次传输都传输最高位,通过SCL的拉高拉低实现1bit的发送,这个函数不细讲了,就是根据时序,拉高拉低就可以。

    为什么IIC_Send_Byte发送的指令是0XA0呢,还是要看AT24C的数据手册,芯片用的是EEPROM,AT24C02的意思就是它是2K的

DEVICE/PAGE ADDRESSES (A2, A1, A0): The A2, A1 and A0 pins are device

address inputs that are hard wired for the AT24C01A and the AT24C02. As many as

eight 1K/2K devices may be addressed on a single bus system

    这段是说呢,因为它小,所以在一个总线系统内可以搞个片选,空了三个引脚,就是可以连8个,16K那个就不用片选引脚。

    再看下AT24C的数据手册,关于器件地址和字写入那里,

stm32之TFT触摸屏(ILI9320)(2):由触摸屏写入EEPROM(AT24CXX)谈IIC的使用

stm32之TFT触摸屏(ILI9320)(2):由触摸屏写入EEPROM(AT24CXX)谈IIC的使用

    上面这个呢是Device address的图,说明了机器地址的结构,2K的EEPROM高4位为0xA0 ,下面这个图不是帧结构而是SDA上的数据,可以看到,发送期间地址--应答---字地址--应答----数据--应答,这么个方式实现了字的写入,也就是写入了机器地址,等个应答,这么个意思,这里都是0,说明这个EEPROM就一片。

    发送函数的下一个是IIC_Wait_Ack()。先配置PB11上拉/下拉输入模式,使SCK和SDA均为高,超时返回接收失败,未超时,拉低时钟线,这里的应答,与EEPROM的机制有关,查询AT24C的数据手册,有这样一段A write operation requires an 8-bit data word address following the device address word and acknowledgment. Upon receipt of this address, the EEPROM will again respond with a zero and then clock in the first 8-bit data word. Following receipt of the 8-bit data word, the EEPROM will output a zero and the addressing device, such as a microcontroller, must terminate the write sequence with a stop condition. 就是说接收到8位数据之后会返回一个0值,才会确认数据接收成功,后文的发送应答函数IIC_Ack就是发送一个0的意思。

    回到函数AT24CXX_WriteOneByte中,WriteAddr%6和WriteAddr/256,拿个数试下就知道,这个一个是取高8位和低8位的操作,跟>>8一样,这里写入字的地址写成16位的应该是为了更好的可移植性,c02是只有8位数据地址的

AT24C01A, 1K SERIAL EEPROM: Internally organized with 16 pages of 8 bytes each,

the 1K requires a 7-bit data word address for random word addressing.

AT24C02, 2K SERIAL EEPROM: Internally organized with 32 pages of 8 bytes each,

The 2K requires an 8-bit data word address for random word addressing.

The data word address lower three (1K/2K) or four (4K, 8K, 16K) bits are internally incremented following the receipt of each data word. The higher data word address bits are not incremented, retaining the memory page row location.

    把程序中的高8位那段去掉,在屏幕校准也是完全没问题的,有可能是数据手册没写特别具体.

    这段就是通过IIC向EEPROM写入了需要存储的数据,之后屏幕里的相关函数中就没有IIC的相关操作了,这里注意一点,AT24CXX数据手册中SDA line示意非常重要,看懂这个SDA line,就可以模拟IIC进行数据的传输了。


关键字:stm32  TFT触摸屏  写入EEPROM 引用地址:stm32之TFT触摸屏(ILI9320)(2):由触摸屏写入EEPROM

上一篇:stm32之位带操作:原理及使用方式
下一篇:stm32之nRF24L01无线模块(2):无线模块的地址

推荐阅读最新更新时间:2024-03-16 16:16

STM32之RCC
STM32 RCC复位与时钟配置,我首先忽略掉复位,首先学习时钟配置,复位以后用到再学习 STM32有多个时钟源,分别是 HSI:上电默认启动,因精度不高所以先不采用,以后如果需要再使用 HSE:外部高速时钟,系统时钟一般采用它,经过PLL倍频作为系统同时钟 LSE:外部低速时钟,一般专门用于RTC,等到RTC模块时再使用 LSI:内部低速时钟,精度不高,一般用于IWDGCLK 时钟系统框图如下: STM32中各个模块都有自己的时钟,当使用相应的模块时首先记得把此模块时钟开启 本次学习使用标准固件库3.3.0 好了,看明白上图咱就开始吧: void RCC_Configurati
[单片机]
<font color='red'>STM32</font>之RCC
STM32动态更改PWM波频率和占空比
STM32的PWM波动态调频和调占空比 以TIM3_CH1为例 (1)定时器工作原理 定时器的时基单元包含三个部分:①自动装载寄存器(TIMx_ARR),②预分频器寄存器 (TIMx_PSC),③计数器寄存器(TIMx_CNT)。设置自动装载值,预分频器根据所设置的分频系数(1-65536)对定时器所选择的时钟源进行分频,分频后的频率驱动计数器。计算器开始计数,当计数器达到自动装载值时,重新开始计数! 以秒表举例:时钟源是秒针,经过60分频后的频率变成分针,分针一分钟一分钟的增加,当分针数达到60时,又从零开始计数。在这个例子中,秒针是时钟源,第一个60就是预分频器设置的值,第二个60就是自动装载寄存器设置的值。 (2)P
[单片机]
<font color='red'>STM32</font>动态更改PWM波频率和占空比
STM32之HAL库和标准库的GPIO
HAL库 使用CubeMX自动生成需要的代码。 一、初始化GPIO 自动生成的HAL库GPIO初始化代码: void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO
[单片机]
基于STM32 MCU的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的led固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功能。
[电源管理]
基于<font color='red'>STM32</font> MCU的太阳能LED街灯解决方案
漫谈STM32的GPIO
简介:单片的输入输出不叫GPIO,仅仅是个io,稍微复杂点的就是串口,至于后面那些增强的1t的带da的单片机,都不属于入门学习范围.那些东西都是为了低成本而存在,对学习没有任何作用.只要初学者入门了,所有片内外设都非常简单的搞定.本文是一片基础学习文章.入门者的精神食粮. 理解gpio不仅仅是会配置寄存器,因为好多人根本不知道寄存器如何配置.如果不信的话那回答我这个问题,stm32的io频率到底该配置成多少Mhz? 上面这张图是来自stm32的中文版手册.我对这些模块进行了简单的标注.下面我就从外到内进行分析信号的流向以及每一部分存在/屏蔽的意义. 先看上半部分,就是io的I,input,输入功能.信号从io引脚流入,
[单片机]
漫谈<font color='red'>STM32</font>的GPIO
STM32 RS485 modbus通讯源程序,亲测有效
Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。modbus协议简单解析如下: 1、主机对从机写数据操作 如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文: 01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验 假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是: HoldDataReg = 0x0017
[单片机]
<font color='red'>STM32</font> RS485 modbus通讯源程序,亲测有效
一文了解STM32窗口看门狗的真正作用
STM32有2个看门狗:独立看门狗和窗口看门狗。 独立看门狗IWDG--独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。 窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。 简单的讲,看门狗就是检测系统故障的,如果因为系统故障而没有及时喂狗,则引发复位重启。 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但是这样有一个隐患,有可能程序跑乱了又跑回正常的地方,或者跑乱的程序正好执行了刷新看门狗操作,这样的情况下一按的看门狗就检测不出来故障了;但是如果使用窗口看门狗,程序员可以根据程序正常
[单片机]
什么是中断 stm32中断服务函数
中断概念: 中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。 中断作用: 计算机与外设之间的联系一般通过两种方法:一是通过CPU控制来进行数据的传送;二是在专门的芯片控制下进行数据的传送。我们所说的DMA,就是不用CPU控制,外设同内存之间相互传送数据的通道,在这种方式下,外设利用DMA通道直接将数据写入存储器或将数据从存储器中读出,而不用CPU参与,系统的速度会大大增加。 你打开stm32的启动文件,例如startup_stm32f10x_hd.s 里面有很多中断跳转的
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved