STM32F103xx Cortex-M3系列的芯片含三路SPI通道,红牛开发板用了两路,SPI1连接AT45DB161B型号的SPI Flash,SPI2连接ADS7843触摸屏信号处理芯片,SPI3最好不要用,因为和JTAG的管脚有冲突,调试时会有问题。EM-STM3210E开发板由于不含触摸屏,所以只用了一路来连接SPI Flash。本篇博文介绍触摸屏坐标获取,所以只有拥有红牛开发板的用户可以测试。

先简单介绍一下SPI相关的知识,SPI是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号×××之间,是一种高速的,全双工,同步的通信总线。

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式),相关管脚含义如下:

(1)SDO – 主设备数据输出,从设备数据输入   

(2)SDI – 主设备数据输入,从设备数据输出

(3)SCLK – 时钟信号,由主设备产生  

 (4)CS – 从设备使能信号,由主设备控制

(详情请参见百度百科SPI词条:http://baike.baidu.com/view/245026.htm)

再说一下ADS7843芯片的相关知识,红牛开发板关于这个芯片的原理图如下:

比较可惜的是,从原理图上看其中断管脚(INT)没有引出,所以只能通过轮询获取X,Y坐标了。

ADS7843芯片的SPI通信时序图如下:

(ADS7843参考资料:http://wenku.baidu.com/view/bc414573f242336c1eb95e6c.html)

查ADS7843相关资料可知,读X坐标的控制字为0x90,读Y坐标的控制字为0xD0。从通信时序图可知,回传的数据为12位,从返回的第2个字节开始算起,其格式如下:

第2个字节:12位的高8位

第3个字节:112位的低4位,并且在该字节的高位,低4位补零。

换算公式:X(或Y) = (byte[2]<<8 | byte[1])>>4

需要说明的是,SPI驱动需要配置的参数的很多,有些参数在驱动中采用了默认值,其内容如下:

两线双向 / 主模式 / 第一个时钟沿触发 /  软件从设备管理启用 /先发送高字节。

其它的参数是可配置的,配置接口类如下:

public class Configuration

{

public readonly Cpu.Pin BusyPin;

public readonly bool BusyPin_ActiveState;

public readonly bool ChipSelect_ActiveState;

public readonly uint ChipSelect_HoldTime;

public readonly Cpu.Pin ChipSelect_Port;

public readonly uint ChipSelect_SetupTime;

public readonly bool Clock_Edge;

public readonly bool Clock_IdleState;

public readonly uint Clock_RateKHz;

public readonly SPI.SPI_module SPI_mod;

……

}

需要说明的是,BusyPin管脚一般不用配置,另外ChipSelect_Port片选管脚一定不要配置,SPI驱动中已经进行了配置,我就是因为配置了这个,害的我调试了近两天的时间才发现这个问题。

SPI创建和声明的代码如下:

SPI.Configuration spiConfig = new SPI.Configuration((Cpu.Pin)(-1), false, 1, 1, false, true, 2250, SPI.SPI_module.SPI2);

SPI spi = new SPI(spiConfig);

获取触摸屏的核心代码如下:

static void GetPoint(SPI spi, out int ux, out int uy)

{

int i, d1 = 0xFFFF, d2 = 0xFFFF;

byte[] writeBufferX = new byte[3] { 0x90, 0, 0 };

byte[] writeBufferY = new byte[3] { 0xD0, 0, 0};

byte[] readBuffer = new byte[2] { 0 ,0};

//--

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

{

spi.WriteRead(writeBufferX, readBuffer, 1);

d1 = (readBuffer[0] << 8 | readBuffer[1])>>4;

if (d1 == d2) break;

d2 = d1;

}

uy = d1;

//--

d2 = 0xFFFF;

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

{

spi.WriteRead(writeBufferY,readBuffer, 1);

d1 = (readBuffer[0] << 8 | readBuffer[1]) >> 4;

if (d1 == d2) break;

d2 = d1;

}

ux = d1;

}

以上函数获取的其实并不是我们习惯的屏幕坐标,如(0,0)-(320,240),获取的数据需要转换才成,这部分代码我在示例中没有添加,希望有兴趣的网友当做一个练习,自己做一下,相关算法可以参考如下文章:

http://wenku.baidu.com/view/b163984d2b160b4e767fcf39.html

示例代码运行后的效果图如下,你直接在屏幕上进行敲击,就可以在屏幕上看到相应的坐标变化:

   注意:红牛开发板需要下载最新的V0.9.5固件才能正常运行。

-----------------------------------------------------------------------------------------

【低价开发板】http://item.taobao.com/item.htm?id=7117999726 
×××:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/SPITest_ADS7843.rar
文章参考: 《.Net Micro Framework 快速入门》
中文讨论组:http://space.cnblogs.com/group/MFSoft/

转载于:https://blog.51cto.com/yfsoft/359377

【STM32 .Net MF开发板学习-10】SPI测试之触摸屏坐标获取相关推荐

  1. 【STM32 .Net MF开发板学习-02】GPIO测试

    前段时间我借用市面上现成的Corex-M3开发板,打造了最低价的.Net Micro Framework开发板(参见<免费发放firmwave,打造史上最低价.Net MF开发板>),在此 ...

  2. 【STM32 Net MF开发板学习-27】GPRS通信实现

    GPRS是General Packet Radio Service(通用分组无线服务技术)的简称,它是GSM移动电话用户可用的一种移动数据业务.GPRS和以往连续在频道传输的方式不同,是以封包(Pac ...

  3. 【STM32 .Net MF开发板学习-17】Wifi遥控智能小车

    恰好以前购买的一个PDA含Wifi功能,所以与其用PC通过Zigbee控制智能小车,不如用PDA来控制,这样更为方便,不过由于目前.NET MF开发板不直接支持Wifi功能,所以我们也只好间接控制了, ...

  4. 【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取

    目前生产串口摄像头的厂家有很多,每家的通信协议也不同,所以针对不同的摄像头都必须编写相对应的摄像头驱动程序. 最早做医疗项目的时候,开发过一款串口摄像头的驱动,不过是配合TinyIOs而使用,并没有把 ...

  5. 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)

    在<为Cortex-M3打造轻量级TinyGUI>中我们提到.NET MF的官方图形库为WPF,考虑到内存的限制和CPU的性能,所以我们开发了TinyGUI库,并在<TinyGUI绘 ...

  6. 【STM32 NET MF开发板学习-29】摄像头蓝牙图像远程获取

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 目前生产串口摄像头 ...

  7. 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...

  8. 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...

  9. 【STM32 .Net MF开发板学习-25】LED数码管显示

    在单片机系统中,LED数码管的应用是很常见的,不过对我们偏软件开发的人来说,要想研究LED还得储备一定的知识才能进行近一步的工作.不过采用.NET Micro Framework系统,我们马上就可以站 ...

  10. 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例

    .Net Micro Framework官方图形库是WPF,由于目前ST Cortex-M3开发板RAM太小,最大才512K(常见是128K或256k),并且Cortex-M3的CPU主频也不太高,运 ...

最新文章

  1. HTML标签元素的分类
  2. iis应用程序池监控方法实例
  3. 1.9 可避免误差-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  4. 大数据成败之“监”:美团数据质量监管平台这样搭建
  5. R学习_multitaper包解析2:子函数spec.mtm.dpss,dpssHelper
  6. python发送json数据_在Websockets上发送JSON
  7. 程序开机全屏且不能见任何windows界面、不能使用系统热键
  8. PHP中header的用法
  9. java中socket类_Java中的Socket的用法
  10. Guava CaseFormat
  11. windows高精度计数器
  12. python什么时候用进程什么时候用线程_[译] Python 的多线程与多进程
  13. 数字图像处理实验MATLAB版+实验报告亲笔
  14. VC++6.0软件安装教程(win10亲测可用)
  15. 80后,规划好你的职业道路!
  16. WPS页眉不同页之间的修改
  17. PPT学习整理(八)PPT图片技巧
  18. 根据表一和表二写出查询结果如表三的sql语句
  19. 倪光南华为鸿蒙,院士倪光南谈华为鸿蒙:国产操作系统需要生态支持
  20. 中国居民身份证号码检验程序

热门文章

  1. YIi2 Pjax简单使用
  2. JavaScript 框架库 - jQuery
  3. C++ Iostreams 用法详解(二)标准输入输出
  4. 《Java基础学习笔记》JAVA基础
  5. blog迁来迁去的......
  6. 网站如何做分布式(集群)的大纲
  7. 个人mysql配置命令
  8. JAVA总结实录01 : 异常处理 try-catch-finally
  9. ubuntu jdk install
  10. 转: Oracle AWR 报告 每天自动生成并发送邮箱