8517|8

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【Atmel SAM R21】使用SPI驱动微雪LCD [复制链接]

本帖最后由 ljj3166 于 2015-1-10 18:08 编辑

看着论坛大神都开始可劲折腾zigbee楼主还在折腾基本外设
这几天简单看了看R21的SPI外设
手上有几块LCD,不过都是并口的,还好微雪的LCD支持SPI
这货的LCD驱动IC是BD663474,触摸IC是XPT2046,今天先驱动一下LCD,触摸后面再折腾
不过这货够奇葩的,有图有真相

没错,您没眼花,居然是一块Altera的CPLD
官方文档解释说这块CPLD是把SPI接口转成8086并行接口,与BD663474通信
但是BD663474却这样说

BD663474驱动IC直接原生就支持SPI啊,楼主也是醉了,有钳就是要横着走
就是这么个接口,让楼主用R21的SPI外设驱动这块LCD,花了2天时间

先看看ASF中的SPI驱动吧,鬼佬的编程思维很有意思
对于SPI-maste的配置,顶层就有spi_module、spi_config俩个结构体
这俩结构体下面有包含许多的enum数据类型,原来都在枚举啊
看看spi_config:
  1. struct spi_config {
  2.         /** SPI mode. */
  3.         enum spi_mode mode;
  4.         /** Data order. */
  5.         enum spi_data_order data_order;
  6.         /** Transfer mode. */
  7.         enum spi_transfer_mode transfer_mode;
  8.         /** MUX setting. */
  9.         enum spi_signal_mux_setting mux_setting;
  10.         /** SPI character size. */
  11.         enum spi_character_size character_size;
  12.         /** Enabled in sleep modes. */
  13.         bool run_in_standby;
  14.         /** Enable receiver. */
  15.         bool receiver_enable;
  16. #  ifdef FEATURE_SPI_SLAVE_SELECT_LOW_DETECT
  17.         /** Enable Slave Select Low Detect. */
  18.         bool select_slave_low_detect_enable;
  19. #  endif
  20. #  ifdef FEATURE_SPI_HARDWARE_SLAVE_SELECT
  21.         /** Enable Master Slave Select. */
  22.         bool master_slave_select_enable;
  23. #  endif
  24.         /** Union for slave or master specific configuration. */
  25.         union {
  26.                 /** Slave specific configuration. */
  27.                 struct spi_slave_config slave;
  28.                 /** Master specific configuration. */
  29.                 struct spi_master_config master;
  30.         } mode_specific;
  31.         /** GCLK generator to use as clock source. */
  32.         enum gclk_generator generator_source;
  33.         /** PAD0 pinmux. */
  34.         uint32_t pinmux_pad0;
  35.         /** PAD1 pinmux. */
  36.         uint32_t pinmux_pad1;
  37.         /** PAD2 pinmux. */
  38.         uint32_t pinmux_pad2;
  39.         /** PAD3 pinmux. */
  40.         uint32_t pinmux_pad3;
  41. };
复制代码

再去查看枚举类型spi_mode:
  1. <b><font size="3">enum spi_mode {
  2.         /** Master mode. */
  3.         SPI_MODE_MASTER         = 1,
  4.         /** Slave mode. */
  5.         SPI_MODE_SLAVE          = 0,
  6. };</font></b>
复制代码
转来转去,人就晕菜了
给ATMEL写库函数的哥们,以前肯定是写Linux代码的
初学者看几次就想抽人了,这生态圈,只给大牛们玩啊
好吧,不吐槽了,来驱动LCD
SPI需要配置的东西相对比较多,譬如主从、发送顺序、发送模式、发送字节数等等
这些都在spi_get_config_defaults这个函数中有处理,这个函数在spi.h文件里头
  1. <b><font size="3">static inline void spi_get_config_defaults(
  2.                 struct spi_config *const config)
  3. {
  4.         /* Sanity check arguments */
  5.         Assert(config);

  6.         /* Default configuration values */
  7.         config->mode             = SPI_MODE_MASTER;
  8.         config->data_order       = SPI_DATA_ORDER_MSB;
  9.         config->transfer_mode    = SPI_TRANSFER_MODE_0;
  10.         config->mux_setting      = SPI_SIGNAL_MUX_SETTING_D;
  11.         config->character_size   = SPI_CHARACTER_SIZE_8BIT;
  12.         config->run_in_standby   = false;
  13.         config->receiver_enable  = false;
  14. #  ifdef FEATURE_SPI_SLAVE_SELECT_LOW_DETECT
  15.         config->select_slave_low_detect_enable= true;
  16. #  endif
  17. #  ifdef FEATURE_SPI_HARDWARE_SLAVE_SELECT
  18.         config->master_slave_select_enable= false;
  19. #  endif
  20.         config->generator_source = GCLK_GENERATOR_0;

  21.         /* Clear mode specific config */
  22.         memset(&(config->mode_specific), 0, sizeof(config->mode_specific));

  23.         /* Master config defaults */
  24.         config->mode_specific.master.baudrate = 500000;

  25.         /* pinmux config defaults */
  26.         config->pinmux_pad0 = PINMUX_DEFAULT;
  27.         config->pinmux_pad1 = PINMUX_DEFAULT;
  28.         config->pinmux_pad2 = PINMUX_DEFAULT;
  29.         config->pinmux_pad3 = PINMUX_DEFAULT;

  30. };</font></b>
复制代码
如果要配置这些,就得去修改
或者通过spi_config结构体去调整
对比BD663474的时序:

时钟空闲为高,第二个时钟边沿采样
看看R21的SPI模式:
  1. <b><font size="3">enum spi_transfer_mode {
  2.         /** Mode 0. Leading edge: rising, sample. Trailing edge: falling, setup. */
  3.         SPI_TRANSFER_MODE_0 = 0,
  4.         /** Mode 1. Leading edge: rising, setup. Trailing edge: falling, sample. */
  5.         SPI_TRANSFER_MODE_1 = SERCOM_SPI_CTRLA_CPHA,
  6.         /** Mode 2. Leading edge: falling, sample. Trailing edge: rising, setup. */
  7.         SPI_TRANSFER_MODE_2 = SERCOM_SPI_CTRLA_CPOL,
  8.         /** Mode 3. Leading edge: falling, setup. Trailing edge: rising, sample. */
  9.         SPI_TRANSFER_MODE_3 = SERCOM_SPI_CTRLA_CPHA | SERCOM_SPI_CTRLA_CPOL,
  10. };</font></b>
复制代码

从那么在R21的spi配置中,应该是属于MODE 3呀
按照这个思路,捣鼓了一晚上,啥都末出现
回头看了看Open1081的代码,恍然大悟
  1. <b><font size="3">SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  2.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  3.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  4.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  5.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  6.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  7.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  8.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;</font></b>
复制代码
SPI_CPHA_1Edge+SPI_CPOL_Low,这货配置的SPI是标准MODE 0啊
估计经过了那块接口转换的CPLD,SPI定制成了MODE 0
BD663474本身的SPI接口其实根本就没有使用
坑爹啊,调了2个晚上了
还好最终解决问题
主函数代码:
  1. int main(void)
  2. {
  3.         SystemInit();
  4. configure_usart();
  5. usart_write_buffer_wait(&usart_instance, "test\r\n", sizeof("test\r\n"));
  6. LCD_RST;
  7. delay_ms(10);
  8. LCD_RST_DONE;
  9. LCD_Initializtion();
  10. LCD_Clear(Yellow);
  11. GUI_Text(0,170,"Welcome SAMR21 Xplained Pro",Red,Yellow);
  12. GUI_Text(0,186,"Hello,EEWorld!! I'm Ljj3166!",Red,Yellow);
  13. LCD_DrawLine(0,120,239,120,Red);
  14. LCD_DrawLine(0,121,239,121,Red);
  15. LCD_DrawLine(0,0,0,120,Red);
  16. LCD_DrawLine(0,1,0,121,Red);
  17. LCD_DrawLine(40,40,40,120,Red);
  18. LCD_DrawLine(41,41,41,121,Red);
  19. LCD_DrawLine(80,80,80,120,Red);
  20. LCD_DrawLine(81,81,81,121,Red);
  21. LCD_DrawLine(100,100,100,120,Red);
  22. LCD_DrawLine(101,101,101,121,Red);
  23.         while (true) {
  24.                 delay_ms(300);
  25.                 port_pin_toggle_output_level(LED0);
  26.         }
  27. }
复制代码

有图有视频,才是真的有真相




R21的时钟还整得不是很清楚,有待进一步了解
下次该折腾触摸了



最新回复

楼主,能否加我微信,特别需要请教下,Samr21。我微信号525489751  详情 回复 发表于 2018-4-20 19:37

赞赏

2

查看全部赞赏

点赞 关注(2)
个人签名

So TM what......?

 

回复
举报

5979

帖子

8

TA的资源

版主

沙发
 
这个不错 我也需要驱动个LCD

点评

一起一起,这个LCD有点意思  详情 回复 发表于 2015-1-10 19:19
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
chenzhufly 发表于 2015-1-10 18:52
这个不错 我也需要驱动个LCD



一起一起,这个LCD有点意思
 
个人签名

So TM what......?

 

 

回复

1万

帖子

16

TA的资源

版主

4
 
历害啊,顶你一下
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

79

帖子

1

TA的资源

一粒金砂(中级)

5
 
赞一个 学习了!
 
 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

6
 
atmel,好好玩,呵呵
 
 
 

回复

1万

帖子

25

TA的资源

版主

7
 
顶一个。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(中级)

8
 
不知如何才能在任意树莓派3的系统上加载驱动…… 期待后续……
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼主,能否加我微信,特别需要请教下,Samr21。我微信号525489751
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表