嵌入式培训机构四个月实训课程笔记(完整版)-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位)

相关推荐
雯宝4 小时前
mnt_init 函数
linux
律宏阔10 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔10 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴10 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千11 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3711 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3711 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3711 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW11 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW11 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux