5440|3

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【Atmel SAM R21】时钟、SPI和触摸 [复制链接]

本帖最后由 ljj3166 于 2015-1-12 18:45 编辑

下午休息
果断开搞
基本上把触摸吃下了
过程中遇到不少问题,一起瞧瞧。


1、时钟
在上篇帖子:https://bbs.eeworld.com.cn/thread-454206-1-1.html里面,虽然驱动起来了LCD显示
但是刷新速率很慢,第一反应时SPI的时钟速度
R21的SPI设置,默认情况下是100KHz,修改到500KHz,刷新速度上来了一些
但是依然不尽人意
来看看时钟吧
阅读数据手册发现在默认情况下,R21的时钟居然是令人发指的1MHz
没办法,谁叫它冲着低功耗物联网应用呢
写了几句代码,测试一下
  1. SysTick_Config(1000);
复制代码
  1. SysTick_Handler()
  2. {
  3.         port_pin_toggle_output_level(PIN_PA14);
  4. }
复制代码
无敌的systick,和systick服务
大致意思是每千分之一的时钟,把PA14翻转一次
看看默认情况下,PA14口的波形

真的是1kHz的样子
开始捯饬时钟吧
做个简单的配置
  1. void clock_init(){
  2.         struct system_clock_source_osc8m_config osc8m_conf;
  3.         system_clock_source_osc8m_get_config_defaults(&osc8m_conf);
  4.         osc8m_conf.prescaler       = SYSTEM_OSC8M_DIV_1;
  5.         osc8m_conf.on_demand       = true;
  6.         osc8m_conf.run_in_standby  = false;
  7.         system_clock_source_osc8m_set_config(&osc8m_conf);        
  8.         
  9.         system_clock_source_enable(GCLK_SOURCE_OSC8M);
  10.         
  11.         system_cpu_clock_set_divider(SYSTEM_MAIN_CLOCK_DIV_1);
  12.         system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBA, SYSTEM_MAIN_CLOCK_DIV_1);
  13.         system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBB, SYSTEM_MAIN_CLOCK_DIV_1);
  14.         system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBC, SYSTEM_MAIN_CLOCK_DIV_1);
  15. }
复制代码
开启卑职的8M时钟,再泡泡systick看看

嗯,差不多8kHz的样子
手上就这个渣渣USBee,普源神马的,快到碗里来!!!!
时钟配置之后,刷屏速度那是杠杠的

也尝试过外置晶振、DPLL、DFLL,一次没成功,不折腾了
8M实测目前也够用了,以后再说


2、SPI配置
这块屏很有意思,驱动IC和触摸IC使用同一条SPI总线
CLK和MOSI共用,由于液晶驱动IC无需发送数据给R21,所以MISO就由触摸IC使用
所有的SPI处理过程都由CPLD处理,和驱动IC、触摸IC没有半毛钱关系。所以它们的数据手册还是别看了
R21刚开始死活接收不到触摸IC返回的数据,从串口打印发现MISO接收到的都是0
挂上USBee,发现实际上MISO是有数据过来的
把R21的MISO直接到Vcc,发现接收到的数据依然为0
毫无疑问,R21的SPI配置有问题
捯饬了半天,才整好,其实也是受了ASF的蛊惑
看正确的配置
  1. uint16_t SPI_Communication(uint16_t send_char)
  2. {
  3.         uint16_t RX_data;
  4.         while (!spi_is_ready_to_write(&spi_master_instance)) {}
  5.         spi_write(&spi_master_instance, send_char);
  6.         while(!spi_is_write_complete(&spi_master_instance)){}
  7.         while(!spi_is_ready_to_read(&spi_master_instance)){}
  8.         spi_read(&spi_master_instance,&RX_data);
  9.         return RX_data;
  10. }
复制代码
其实和很多SPI通信一样,通过查询方式通信
但是,看了ASF中对spi_write和spi_read的描述,却让楼主大呼坑爹
看看spi_write的代码
  1. static inline enum status_code spi_write(
  2.                 struct spi_module *module,
  3.                 uint16_t tx_data)
  4. {
  5.         /* Sanity check arguments */
  6.         Assert(module);
  7.         Assert(module->hw);

  8.         SercomSpi *const spi_module = &(module->hw->SPI);
  9.         /* Check if the data register has been copied to the shift register */
  10.         if (!spi_is_ready_to_write(module)) {
  11.                 /* Data register has not been copied to the shift register, return */
  12.                 return STATUS_BUSY;
  13.         }
  14.         /* Write the character to the DATA register */
  15.         spi_module->DATA.reg = tx_data & SERCOM_SPI_DATA_MASK;
  16.         return STATUS_OK;
  17. }
复制代码


其实已经调用了查询函数spi_is_ready_to_write,没看清楚用的是if,结果折腾了老半天,请原谅楼主的不仔细
再翻出ASF宝典

里焦外嫩啊
果断在相关位置撸上这几句
  1. while (!spi_is_ready_to_write(&spi_master_instance)) {}
  2. while(!spi_is_write_complete(&spi_master_instance)){}
  3. while(!spi_is_ready_to_read(&spi_master_instance)){}
复制代码


手起刀落,一切结束了


还有SPI的频率,似乎和main clock有关,只能到一半这个样子
8M下,spi最大可以到4M
数据手册上也没看到具体的说明,这里有些很奇怪的问题
4M可以跑,1M可以跑,2M、3M居然不行;400k可以跑,40k可以跑,500k、800k居然跑不了
ATMEL的时钟,真不是一般的复杂啊


3、触摸屏
SPI时钟对这个触摸的影响确实很大
上M的时钟,校准会出错
太低的时钟,显示速度慢到坑爹
书写时还有断线的现象
MXCHIP官方给出的驱动,算法上还得要仔细推敲一下才行
后面再慢慢折腾吧


最后上个测试视频吧,可以从串口采集点击触摸屏的坐标




youku又把楼主的视频映射到1/2逆世界去了

触摸屏的数据基本上已经能够采集到了,接下来通过无线广播出去








最新回复

赞一个  详情 回复 发表于 2016-1-3 13:11
点赞 关注
个人签名

So TM what......?

 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
干掉沙发,干掉〇回复
 
个人签名

So TM what......?

 

 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
挺不错的。。。学习了!!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
赞一个
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表