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

ljj3166   2015-1-12 18:12 楼主
下午休息 果断开搞 基本上把触摸吃下了 过程中遇到不少问题,一起瞧瞧。 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口的波形 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. system_clock_source_enable(GCLK_SOURCE_OSC8M);
  9. system_cpu_clock_set_divider(SYSTEM_MAIN_CLOCK_DIV_1);
  10. system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBA, SYSTEM_MAIN_CLOCK_DIV_1);
  11. system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBB, SYSTEM_MAIN_CLOCK_DIV_1);
  12. system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBC, SYSTEM_MAIN_CLOCK_DIV_1);
  13. }
开启卑职的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逆世界去了 触摸屏的数据基本上已经能够采集到了,接下来通过无线广播出去 本帖最后由 ljj3166 于 2015-1-12 18:45 编辑
So TM what......?

回复评论 (3)

干掉沙发,干掉〇回复
So TM what......?
点赞  2015-1-12 18:47
挺不错的。。。学习了!!
点赞  2015-12-11 10:07
赞一个
点赞  2016-1-3 13:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复