进阶项目(12)PS2键盘驱动程序设计讲解

2023-11-04

写在前面的话

我们从小就开始接触电脑,曾经多么羡慕那些在键盘上洋洋洒洒的人,手指轻柔的飞舞刻画出一章章美丽的篇幅那么作为工程师的我们同样拥有着属于我们的情怀。如果曾经的向往变成我们喜欢的玩具;如果曾经的神秘变成我们夜以继日的痴迷。那么,一切又将如何?梦翼师兄携手大家一起来欣赏、来品味。

项目需求

设计一个ps2键盘的接口驱动电路。

原理分析

ps2的接口如下图所示:

其中,1是数据线DATA;

2是预留N/C;

3是GND;

4是VCC(+5V);

5是时钟信号线CLK;

6是预留N/C;

数据传输的时序图如下图所示:

 

一般的ps2接口,都是ps2产生时钟信号,而且是在上升沿的时候把数据发送出去,而在下降沿的时候数据被采样,大多数的ps2设备发送数据的时钟频率是15Khz-20Khz。每一帧的数据有11位或者12位数据,其中包括:

1位起始位:总为逻辑0;

8位数据位:低位在前;

1位奇偶校验位;

1位停止位:总为逻辑1;

1位答应位:仅用于主机对设备通信中(在本次键盘接口设计中不用)

当键盘的某一个按键被按下的时候,键盘会向外发送那一个按键的通码,当按键松开的时候,键盘就会向外发送那一个按键的断码,需要注意的是,如果按着一个按键不放的话,键盘会以一定的频率发送那一个按键的通码。

右侧小键盘的0-9的通码与断码如下图所示:

 

 

现在我们具体举一个例子来说明ps2接口的工作原理,假设我现在按下小键盘中的0键,再按下按键9,然后把按键0松开,最后再松开按键9,ps2往FPGA发送的数据就会如下,先发0按键的通码8h70,再发9按键的通码8h7d,接着发0按键的断码8hf0 8h70,接着再发9按键的断码8hf0 8h7d,发送数据的顺序如下: 8h70→8h7d→8hf0→8h70→8hf0→8h7d

系统架构

ps2_data_out信号有效的时候,valid会拉高一个周期(valid可用于同其他级联模块的握手)。

 

 

 

 

模块功能介绍

模块名

功能描述

ps2_scan

将ps2接口传输过来数据转成通码或者断码

顶层模块端口描述

端口名

端口说明

clk

系统时钟输入

rst_n

系统复位

Ps2_clk

时钟信号线

Ps2_data_in

数据线

valid

通、断码有效信号(高电平有效)

Ps2_data_out

通、断码信号

 用signaltap ii 分析波形

打开signaltap ii ,将采样时钟设置为clk,采样深度为64Kps2_clkps2_data_in两个输入信号引出来,并将ps2_clk的的触发条件改为下降沿(我们是在ps2_clk为下降沿的时候采集数据),之后进行全编译,并将编译好的sof文件下载到开发板中。

按下数字键“1”(数字小键盘),波形图上出现如下波形:

ps2_clk每个下降沿,我们进行读数据,分别是:“01001011011”。第一位是起始位“0”,后面连续的8位是低位在前的有效数据:“10010110”,改成高位在前就是“01101001”,也就是我们的8‘h69(1的通码就是8’h69)。第十位“1”为奇偶校验位,第十一位“1”是停止位,这两位不需要我们关心。

放开按键“1”,出现了如下的波形:

 

ps2_clk每个下降沿,我们进行读数据,分别是:“00000111111”。第一位是起始位“0”ÿ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进阶项目(12)PS2键盘驱动程序设计讲解 的相关文章

  • Linux设备驱动-procfs

    在Linux中 procfs是进程文件系统 file system 的缩写 包含一个伪文件系统 启动时动态生成的文件系统 可用于内核层和用户层交互信息 这个文件系统通常被挂载到 proc 目录 由于 proc 不是一个真正的文件系统 它也就
  • Failed to execute /linuxrc. Attempting defaults... 解决方案

    今天想移植个根文件系统 使用的板子是友善之臂的S3C2440 这个很多书上都有介绍 难度倒也不是很大 按照手册一步步的来 移植完之后 烧写到flash里面 发现不能运行 怎么回事 检查了一遍 发现和教材上一样 难道教材有问题 在网上找了移植
  • 隔离式栅极驱动器输入级对电机驱动应用的影响

    介绍 在电机驱动应用中为功率级选择隔离式栅极驱动器时 您有多种选择 栅极驱动器可简单可复杂 具有集成米勒箝位 分离输出或绝缘栅双极晶体管 IGBT 发射极的欠压 UVLO 锁定参考等功能 输入级有两个选项 电压输入级或电流输入级 在本文中
  • 软件系统产品线特征及构建过程

    根据SEI定义 结合业界的一些研究 软件产品线有如下几个重要特征 1 一个软件产品线应该有一系列的产品成员组成 既产品家族 2 产品家族中的所有产品都服务于一些特定的领域 3 产品家族成员之间在服务功能 产品质量 产品性能 产品应用范围等方
  • 半虚拟化和全虚拟化的区别

    全虚拟化 Full virtualization 也称为原始虚拟化技术 是另一种虚拟化方法 该模型使用虚拟机协调客户 操作系统和原始硬件 见图2 这里 协调 是一个关键词 因为VMM在客户操作系统和裸硬件之间用于工作协调 一些受保护的指令必
  • Linux I2C 驱动实验

    一 I2C 驱动 本章同样以 I MX6U ALPHA 开发板上的 AP3216C 这个三合一环境光传感器为例 通过 AP3216C 讲解一下如何编写 Linux 下的 I2C 设备驱动程序 Linux 的驱动分离与分层的思想 因此 Lin
  • <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的LED驱动

    Linux开发 驱动开发 之 基于pinctrl gpio子系统的LED驱动 交叉编译环境搭建 Linux开发 linux开发工具 之 交叉编译环境搭建 uboot移植可参考以下 Linux开发 之 系统移植 uboot移植过程详细记录 第
  • Windows10+ubuntu 双系统安装(针对联想小新air14)

    联想小新air14 Windows10 ubuntu 双系统安装 一 准备工作 1 查看电脑配置 1 查看BIOS模式 2 搞清楚硬盘单双 2 制作系统盘 1 资源准备 2 写盘 3 磁盘分区 二 安装过程 1 用做好的系统盘安装系统 2
  • imx6ull驱动开发经验

    1 背景 imx6ull驱动开发基于正点原子的开发板 上面运行linux 4 1 15内核 根文件系统为ubuntu 16 05 5 LTS 2 加载驱动文件chrdevbase ko文件时 先使用depmod生成依赖文件时 提示无modu
  • 使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

    1 介绍 SAM9X60 处理器有部分OTP One Time Programming Aera 可用于存储user data 这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中 为什么要
  • 磁盘数据线接触不良的故障排查

    手头有个小型主机 运行centos 发现工作很不稳定 经常启动不起来 就算启动起来也会在几分钟内出现各种IO错误 可能出现以下几种报错 1 只读文件系统 Read only file system 尝试对磁盘写入的时候可能出现这个错误 2
  • 系统架构设计师之软件架构风格

    系统架构设计师之软件架构风格
  • STM32 CAN通信理解(是半双工还是全双工?)

    STM32F429 CAN通信 CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519 是国际上应用最广泛的现场
  • windows内核驱动开发(WDK环境搭建)

    去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 WDK Windows drivers Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了 下面直接下载步
  • LCD背光调节实验

    目录 LCD 背光调节简介 硬件原理分析 实验程序编写 编译下载验证 编写Makefile 和链接脚本 编译下载 不管是使用显示器还是手机 其屏幕背光都是可以调节的 通过调节背光就可以控制屏幕的亮度 在户外阳光强烈的时候可以通过调高背光来看
  • <Linux开发>驱动开发 -之- Linux LCD 驱动

    Linux开发 驱动开发 之 Linux LCD 驱动 交叉编译环境搭建 Linux开发 linux开发工具 之 交叉编译环境搭建 uboot移植可参考以下 Linux开发 之 系统移植 uboot移植过程详细记录 第一部分 Linux开发
  • Windows驱动开发(一)第一个驱动程序

    首先我们需要了解 在操作系统中 是分两种权限的 一种是内核态 我们也称为0环 一种是用户态 称之为3环 而在我们的电脑中 驱动程序是运行在内核态的 这意味着和操作系统内核是在同一权限的 而普通的应用程序的权限是最低的 高权限谁不想拥有呢 因
  • linux使用文件描述符0、1和2来处理输入和输出

    文件描述符012 在Linux中 文件描述符0 1和2分别代表标准输入 stdin 标准输出 stdout 和标准错误 stderr 它们用于处理进程的输入和输出 文件描述符0 stdin 文件描述符0是进程的标准输入 通常用于读取用户的输
  • 学习区分dB、dBm、dBuV、dBi

    dB 对于分贝的概念 很多朋友最早接触这个概念 是用 分贝 评估声音的大小 声音的大小用分贝 dB 表示 是一种对数单位 用来描述声音的强度或功率比例 如果P是我们需要测试的声压级或声功率级 P0是参考值 通常取为标准听觉阈限的声压级 X
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是

随机推荐

  • 字符串查找之 KMP 算法思路讲解和代码实现

    算法介绍 KMP 算法是一种改进的字符串匹配算法 由 D E Knuth J H Morris 和 V R Pratt 提出的 KMP 算法的核心是利用匹配失败后的信息 尽量减少模式串与主串的匹配次数以达到快速匹配的目的 KMP 算法的时间
  • lab值意义_色差仪lab值如何分析

    色差仪在涂料 建材 油漆 涂料 纺织印染 油墨 塑料 染料颜料制造等表面色料工业的配色方面有着广泛的应用 也称为CIELAB均匀色空间 本文深圳京联泰科技给大家就色差仪LAB值如何分析作说明 L 亮度 轴表示黑白 0为黑 100为白 a 红
  • 树莓派常用命令

    刷系统 格式化 这样就ok了 开启ssh 刷完系统在boot盘跟目录创建文件ssh就可以了小写不需要后缀 汉化 sudo raspi config 选4 再选1 然后把 4个前面是 zh cn的 用 空格选中 然后 ok 选zh CN ut
  • 科研无人机平台P600进阶版,突破科研难题!

    随着无人机技术日益成熟 无人机的应用领域不断扩大 对无人机研发的需求也在不断增加 然而 许多开发人员面临着无法从零开始构建无人机的时间和精力压力 同时也缺乏适合的软件平台来支持他们的开发工作 为了解决这个问题 我们特别开发了科研无人机平台P
  • 访问私有变量或方法

    本文主要介绍一下如何访问类的私有成员变量以及类的私有方法 这里以下面这个类来举例 interface HomeController UIViewController NSString name2 property nonatomic cop
  • 分页插件(jquery.pagination.js)简单案例

    分页插件 jquery pagination js 前言 开发中需要展示数据操作记录 但数量是未知的 使用该插件 实现分页切换页码的功能 1 使用 引入文件 先引入jQuery 再引入pagination组件 2 具体效果 3 html代码
  • ubuntu挂载Windows共享文件夹

    1 windows下设置shared文件夹为共享文件夹 2 linux下执行命令 sudo apt get install cifs utils samba client sudo mount t cifs o username dhc p
  • linux下搭建测试环境

    linux应用服务器 腾讯云服务器 centos7 传送文件上传到 linux服务器 winscp 文件传输工具 jdk及tomcat安装 本服务器安装的是jkd1 8 tomcat8 mysql 5 7 下载jkd1 8 https ww
  • Mysql在大型网站的应用架构演变

    摘要 本文主要描述在网站的不同的并发访问量级下Mysql架构的演变历程 架构的可扩展性往往和并发是息息相关 没有并发的增长 也就没有必要做高可扩展性的架构 常用的扩展手段主要有Scale up和Scale out两种 前者为纵向扩展 主要通
  • Java八大基本数据类型

    Java八大基本数据类型 开发工具与关键技术 MyEclipse 10 java 作者 刘东标 撰写时间 2019 04 04 Java语言提供了八种基本类型 六种数字类型 四个整数型 两个浮点型 一种字符类型 还有一种布尔型 1 数据类型
  • Windows下创建进程简介

    正在执行的应用程序称为进程 进程不仅仅是指令和数据 它还有状态 状态是保存在处理器寄存器中的一组值 如当前执行指令的地址 保存在内存中的值 以及唯一定义进程在任一时刻任务的所有其他值 进程与应用程序的一个重要的区别在于 进程运行时 进程的状
  • Linux笔记:文本编辑器vi基础使用

    文章目录 目的 工作模式 命令行模式 默认模式 光标移动 屏模滚动 选择复制黏贴与删除 搜索与替换 撤销与重复 插入模式 总结 目的 vi是几乎所有Unix Linux系统下都自带的文本编辑器 有点类似于window上的记事本 如果用惯了现
  • Sophus库的安装和使用教程

    本系列文章为原创 转载请注明出处 作者 Dongdong Bai 邮箱 baidongdong nudt edu 若您觉得本博文对您有帮助 请您为我点赞并关注我 以鼓励我写出更优秀的博文 谢谢 一 Sophus库简介 Eigen库是一个开源
  • 读spi_flash的id

    读SPI FLASH的ID 在上一课中spi i2c adc OLED文件夹下添加spi flash c及spi flash h文件 并添加到si工程中 明确目的 在main函数中调用函数读取spiflash的厂家ID和设备ID 并打印 明
  • MySQL 数据表创建详细SQL语法

    Table 数据表创建 数据表创建 语法规则1 CREATE TEMPORARY TABLE IF NOT EXISTS tbl name create definition table options partion options 语法
  • gitlab 安装,libc.so.6: version `GLIBC_2.25‘ not found

    背景 ubuntu 16 04 以及 ubuntu18 05 安装 gitlab 都报错误 opt gitlab embedded bin ruby lib x86 64 linux gnu libc so 6 version GLIBC
  • 深度优先遍历(邻接矩阵,邻接表)

    深度优先遍历也称为深度优先搜索 简称为DFS 深度优先遍历的思路是从图中某个顶点V出发 访问此顶点 然后从V的未被访问过的邻接点出发深度优先遍历图 直到图中所有与V路径相通的顶点都被访问到 该遍历过程用到递归 深度优先遍历用到了一个辅助数组
  • Caffe中的优化方法

    在Deep Learning中 往往loss function是非凸的 没有解析解 我们需要通过优化方法来求解 Caffe通过协调的进行整个网络的前向传播推倒以及后向梯度对参数进行更新 试图减小损失 Caffe已经封装好了三种优化方法 分别
  • TypeError: ‘builtin_function_or_method‘ object is not subscriptable解决办法

    python报 TypeError builtin function or method object is not subscriptable 这个错 大概率是因为括号用错了 比如应该用圆括号 用成了方括号 或者缺少括号 应检查括号是否使
  • 进阶项目(12)PS2键盘驱动程序设计讲解

    写在前面的话 我们从小就开始接触电脑 曾经多么羡慕那些在键盘上洋洋洒洒的人 手指轻柔的飞舞 刻画出一章章美丽的篇幅 那么作为工程师的我们 同样拥有着属于我们的情怀 如果曾经的向往变成我们喜欢的玩具 如果曾经的神秘变成我们夜以继日的痴迷 那么