淘宝省油宝怎么样:ADS7843触摸屏控制芯片的STM32驱动程序
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 20:51:12
ADS7843的引脚配置如图3所示:
表1为引脚功能说明:
图4为典型应用电路:
ADS7843支持两种参考电压输入模式:一种是参考电压固定为VREF,另一种采取差动模式,参考电压来自驱动电极。这两种模式分别如图6(a)、(b)所示。采用图6(b)的差动模式可以消除开关导通压降带来的影响。
ADS7843的控制字如表4所列,其中S为数据传输起始标志位,该位必为"1"。A2~A0进行通道选择(见表3)。
MODE用来选择A/D转换的精度,"1"选择8位,"0"选择12位。
SER/选择参考电压的输入模式(见表2和3)。PD1、PD0选择省电模式:
"00"省电模式允许,在两次A/D转换之间掉电,且中断允许;
"01"同"00",只是不允许中断;
"10"保留;
"11"禁止省电模式。
为了完成一次电极电压切换和A/D转换,需要先往ADS7843发送控制字,转换完成后再读出电压转换值。标准的一次转换需要24个时钟周期,如图7所示。由于串口支持双向同时进行传送,并且在一次读数与下一次发控制字之间可以重叠,所以转换速率可以提高到每次16个时钟周期,如图8所示。如果条件允许,CPU可以产生15个CLK的话(比如FPGAs和ASICs),转换速率还可以提高到每次15个时钟周期,如图9所示。
ADS7843的stm32驱动程序:
上图为引脚配置,我的开发板为BHS_STM32-III开发板,引脚连接也在上图注明了。
这是ADS7843用到的一些宏定义。
下面是关于ADS7843的函数,包括初始化函数,写控制字函数,读取转换值函数,求平均值函数
void Delayus( int k)
{
int j;
for(j=k; j > 0; j--);
}
void ADS7843_start(void)
{
TP_CS_H();
TP_DCLK_H();
TP_DIN_H();
TP_DCLK_H();
}
void WR_CMD(u8 cmd)
{
u8 i;
u8 temp;
TP_DCLK_L();
for(i = 0;i < 8; i++)
{
temp = cmd & 0x80;
if(temp)
TP_DIN_H();
else
TP_DIN_L();
cmd <<= 1;
TP_DCLK_L();
__nop();__nop();__nop();
TP_DCLK_H();
__nop();__nop();__nop();
}
}
u16 RD_AD(void)
{
u16 buf = 0;
u8 i;
for(i = 0;i < 12;i++)
{
buf <<= 1;
TP_DCLK_H();
__nop();__nop();__nop();
TP_DCLK_L();
__nop();__nop();__nop();
if(TP_DOUT)
buf++;
}
return (buf);
}
u16 average(u16 a[8])
{
u16 i,ave=0,sum=0;
for(i=0;i<8;i++)
{
sum+=a[i];
}
ave=(sum)/6;
return ave;
}
主函数:
int main()
{
u16 X=0,Y=0,a[4],i, avex,avey,x[8],y[8];
SystemInit();
usart_init();
TC_init();
while(1)
{
if(!TP_IRQ_FLAG)
{
Delayus(100);
if(!TP_IRQ_FLAG)
{
GPIO_SetBits(GPIOC,GPIO_Pin_9);
ADS7843_start();
TP_CS_L();
for(i = 0;i < 8;i++)
{
WR_CMD(CHX);
TP_DCLK_H();
__nop();__nop();__nop();__nop();
TP_DCLK_L();
__nop();__nop();__nop();__nop();
X = RD_AD();
x[i] = X;
WR_CMD(CHY);
TP_DCLK_H();
__nop();__nop();__nop();__nop();
TP_DCLK_L();
__nop();__nop();__nop();__nop();
Y = RD_AD();
y[i] = Y;
}
TP_CS_H();
avex = average(x);
a[0] = avex / 1000; //发上位机观察结果
a[1] = (avex - a[0]*1000) / 100;
a[2] = (avex - a[0]*1000 - a[1]*100) / 10;
a[3] = avex % 10;
usart_putchar(a[0]+48);
usart_putchar(a[1]+48);
usart_putchar(a[2]+48);
usart_putchar(a[3]+48);
avey = average(y);
a[0] = avey / 1000; //发上位机观察结果
a[1] = (avey - a[0]*1000) / 100;
a[2] = (avey - a[0]*1000 - a[1]*100) / 10;
a[3] = avey % 10;
usart_putchar(a[0]+48);
usart_putchar(a[1]+48);
usart_putchar(a[2]+48);
usart_putchar(a[3]+48);
}
}
}
}
在此例程中,读取到的平均值我是直接发送到串口的(当然串口也是需要配置的,这里我也不多说了),另外触发中断的方式我用的查询法(相当的不准!),呵呵,我只是试验一下到底有没有数据读出,只是想看看驱动成功没有。
下面是我用串口助手收到的数据:
呵呵,比较乱。 因为图省事,用的查询法,点一下就输出好多组坐标值。