社区导航

 

搜索
查看: 3568|回复: 3

[原创] 【Atmel SAM R21】时钟、SPI和触摸

[复制链接]

3366

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2015-1-12 18:12 | 显示全部楼层 |阅读模式
本帖最后由 ljj3166 于 2015-1-12 18:45 编辑

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


1、时钟
在上篇帖子:http://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口的波形
QQ图片20150112172907.png
真的是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看看
QQ图片20150112173629.png
嗯,差不多8kHz的样子
手上就这个渣渣USBee,普源神马的,快到碗里来!!!!
时钟配置之后,刷屏速度那是杠杠的
1.gif
也尝试过外置晶振、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宝典
QQ截图20150112175433.jpg
里焦外嫩啊
果断在相关位置撸上这几句
  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逆世界去了

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








此帖出自Atmel MCU论坛
So what......


回复

使用道具 举报

3366

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

 楼主| 发表于 2015-1-12 18:47 | 显示全部楼层
干掉沙发,干掉〇回复
So what......


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2015-12-11 10:07 | 显示全部楼层
挺不错的。。。学习了!!


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2016-1-3 13:11 | 显示全部楼层
赞一个


回复

使用道具 举报

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

关闭

站长推荐上一条 /7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-23 18:56 , Processed in 0.159506 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表