[原创] 【Atmel SAM R21】使用SPI驱动微雪LCD

ljj3166   2015-1-10 18:03 楼主
看着论坛大神都开始可劲折腾zigbee楼主还在折腾基本外设 这几天简单看了看R21的SPI外设 手上有几块LCD,不过都是并口的,还好微雪的LCD支持SPI 这货的LCD驱动IC是BD663474,触摸IC是XPT2046,今天先驱动一下LCD,触摸后面再折腾 不过这货够奇葩的,有图有真相 IMG_20100104_094051.jpg 没错,您没眼花,居然是一块Altera的CPLD 官方文档解释说这块CPLD是把SPI接口转成8086并行接口,与BD663474通信 但是BD663474却这样说 QQ截图20150110171545.jpg 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的时序: QQ截图20150110175154.jpg 时钟空闲为高,第二个时钟边沿采样 看看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. }
有图有视频,才是真的有真相 QQ图片20150110180135.jpg QQ图片20150110180125.jpg R21的时钟还整得不是很清楚,有待进一步了解 下次该折腾触摸了 本帖最后由 ljj3166 于 2015-1-10 18:08 编辑
So TM what......?

回复评论 (8)

这个不错 我也需要驱动个LCD
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-1-10 18:52
引用: chenzhufly 发表于 2015-1-10 18:52
这个不错 我也需要驱动个LCD



一起一起,这个LCD有点意思
So TM what......?
点赞  2015-1-10 19:19
历害啊,顶你一下
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2015-1-10 19:40
赞一个 学习了!
点赞  2015-1-10 20:08
atmel,好好玩,呵呵
点赞  2015-1-10 22:13
顶一个。
点赞  2015-1-10 23:38
不知如何才能在任意树莓派3的系统上加载驱动…… 期待后续……
点赞  2016-12-23 11:13
楼主,能否加我微信,特别需要请教下,Samr21。我微信号525489751
点赞  2018-4-20 19:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复