嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)

链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688
提取码:1688

教学内容:

1 ADC

S3C2440的A/D转换器包含一个8通道的模拟输入转换器,可以将模拟输入信号转换成10位数字编码。

在A/D转换时钟频率为2.5MHz时,其最大转换率为500KSPS(5个时钟周期完成一次转换)

输入电压范围为0~3.3V。

AD转换接口中的AIN7-AIN4四个通道为触摸屏的模拟信号输入口,低4位通道为普通的AD通道。

外AD转换:A3-A0

1)、设置ADCCON寄存器

通过ECFLG15可以查询是否转换完成,PRSCEN14预分频使能,PRSCVL13:6:分频大小

SEL_MUX5:3:选择AD转换通道;STDBM2:0普通模式;READ_START1:1,读取完后,自动继续AD转换,0停止使能读取;ENABLE_START0:1,启动AD转换,启动后自动清零

2)、ADCTSC

全设为0

3)、ADCDLY

AD延时

4)、ADCDATn

ADCDAT09:0:AD转换的数据;ADCDAT015:12:触摸屏AD相关,可以不设。

2 、触摸屏 AD **转换:**AIN7-AIN4

1)、设置ADCCON(和普通相关),

2)、设置ADCTSC

UD_SEN---抬起按下中断设置(0:检查点击触摸屏,1:检查弹起触摸屏)

0:使能按下中断; 1:使能台起中断

YM_SEN---选择YMON的输出值

0:输出0(YM=高阻); 1: 输出1(YM=GND)

YP_SEN---选择nYPON的输出值

0:输出0(YP=外部电压); 1:输出1(YP连接AIN5

XM_SEN---选择XMON的输出值

0:输出0( XM=高阻); 1: 输出1(XM=GND)

XP_SEN---选择nXPON的输出值

0:输出0(XP=外部电压);1:输出1(XP连接AIN7

PULL_UP---上拉切换使能(等待中断才上拉,其他1)

0:XP上拉使能; 1: XP上拉禁止

AUTO_PST---自动连续转换X轴和Y轴坐标模式选择(连续是测量X之后会继续测量Y)

0:普通A/D转换; 1:连续X/Y轴转换模式

XY_PST---手动测量X轴和Y轴坐标模式选择

00:无操作模式; 01:对X坐标测量;

10:对Y坐标测量; 11:等待中断模式

等待中断模式:

YMON=1; nYPON=1;XMON=0;nXPON=1

YM=接地

YP=AIN5

XM=高阻

XP=AIN7(上拉)

YM_SEN=1,YP_SEN=1,XM_SEN=0,XP_SEN=1;PULL_UP=0;XY_PST=11

测量X坐标:

YMON=0; nYPON=1;XMON=1;nXPON=0;

YM=高阻

YP=AIN5

XM=接地

XP=上拉

YM_SEN=0,YP_SEN=1,XM_SEN=1,XP_SEN=0;PULL_UP=1;XY_PST=01

测量Y坐标:

YMON=1; nYPON=0;XMON=0;nXPON=1;

YM=接地

YP=上拉

XM=高阻

XP=AIN7

YM_SEN=1,YP_SEN=0,XM_SEN=0,XP_SEN=1;PULL_UP=1;XY_PST=10

//*************触摸中断服务程序**********************************

void __irq Adc_or_TsSep(void)

{

unsigned int valx, valy;

int i;

rSUBSRCPND |= BIT_SUB_TC; //清零

ClearPending(BIT_ADC); //清零

if(rADCDAT0&0x8000)//stylus up

{

Uart_Printf("\nStylus Up!!\n");

rADCTSC &= ~(0x01<<8); // Set stylus down interrupt

}

else

{

Uart_Printf("\nStylus Down!!\n");

// 采集X轴

rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(1);

valx = 0;

for(i=0;i<5;i++)

{

rADCCON|=0x1;

while(rADCCON & 0x1); //启动

while(!(0x8000&rADCCON)); //等待结束

valx += (0x3ff&rADCDAT0); //取值

}

valx /= 5;

// 采集Y轴

rADCTSC=(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(2);

valy = 0;

for(i=0;i<5;i++)

{

rADCCON|=0x1;

while(rADCCON & 0x1);

while(!(0x8000&rADCCON));

valy += (0x3ff&rADCDAT1);

}

valy /= 5;

// 计算X和Y坐标

ResultX = TOUCH_WIDTH * ( TOUCH_DEFAULT_RB -valx) / (TOUCH_DEFAULT_RB - TOUCH_DEFAULT_LB);

ResultY = TOUCH_HEIGHT * (valy - TOUCH_DEFAULT_TB) / (TOUCH_DEFAULT_BB - TOUCH_DEFAULT_TB);

// 恢复到等待台起中断模式

rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);

}

}

//*********************************************

在初始化中设置成,按下中断等待模式,清中断,判断是抬起中断还是按下中断,按下中断中设置ADCTSC为采集x坐标值,(这里不需要设置ADCCON3-5位了,CPU自动设置了 ),按下采集结束后把中断模式改为抬起等待中断模式。

3 SPI 总线

SPI(Serial Peripheral Interface),串行外围设备接口。是由Motorola公司开发,用来在微控制器和外围设备芯片之间提供一个低成本、易使用的全双工同步串行总线。

SPI接口由SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(从使能信号)四种信号线构成。

S3C2440 SPI控制器及寄存器:2个SPI,每个都有6个专用寄存器,共12个寄存器

SPCON:模式控制选择(8位)

SPSTA:状态,注意0位,1:检测收发就绪(8位)

SPPRE:预分频(8位)

SPTDAT:发送寄存器SPTDAT0,SPTDAT1二个(8位)

SPRDAT:接收寄存器SPRDAT0,SPRDAT1二个(8位)

相关推荐
bush47 小时前
嵌入式linux学习记录七,中断
linux·嵌入式
RisunJan7 小时前
Linux命令-nologin(用于系统账户或需要禁止交互式登录的场景)
linux·运维
是阿建吖!7 小时前
【Linux】信号
android·linux·c语言·c++
城北徐宫7 小时前
Linux信号深度解剖:5种产生、3张表、4次切换
linux·c++·学习
倔强的石头1067 小时前
【Linux指南】Linux快捷键与系统实用技巧
linux·运维·服务器
番茄地瓜7 小时前
Linux 配置静态 IP 步骤
linux·运维·服务器
liulilittle7 小时前
论 Linux 内核态全局稳态带宽的卡尔曼估计与工程实现
linux·服务器·网络·c++·计算机网络·tcp·通信
Aaron15888 小时前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理
Irissgwe8 小时前
五、应用层协议HTTP
linux·网络·网络协议·http·状态码·url
三品吉他手会点灯8 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法