找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4200|回复: 2

【单片机】用stm32f103驱动ili9341

[复制链接]
发表于 2018-11-6 07:20:17 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
    上次写的代码用了DMA,做了个异步架构。但其实对于传输的数据很小,等待的数量却很多的情况下,这么做犹如大炮打蚊子——设置DMA通道那会儿花费的时间足够SPI传输完所需要的数据了。ili9341屏幕对于传输“命令”的时候DC线必须为低电平,而传输“数据”的时候DC必须为高电平,命令通常只有1字节,传输完了后就要立即传输数据作为“参数”。这个时候如果你要使用那个异步DMA方式来完成命令和数据的自动传输的话,你不能一次性就把命令和数据都打包好让DMA自动传递数据给SPI控制器,必须在发送完命令后等SPI控制器真的完成了数据传输,再设置GPIO的状态(DC线的电平),然后再进行下一轮的DMA传输。在绘制大量“随机坐标”的像素点,比如使用“中点画圆算法”画圆的时候,或者绘制斜线的时候,由于一条由像素块组成的“斜线”通常由无数条不同长度的由像素块组成的“直线段”组成,这些“直线段”很多时候都很短,使用异步DMA的话,你会把大量的时间浪费在读取异步操作队列、设置DMA通道等各种初始化的操作上。

    事实上,stm32f103它也并不适合这种方式。它既不能产生足够多的、值得去使用异步方式进行输出的数据,速度也不够快——ili9341支持很高的SPI波特率,至少你可以每秒传输60帧以上的每像素18bit的全屏画面(320x240x18,共1382400bit,也就是172800字节。每秒钟60帧意味着波特率约为82 MHz)而stm32f103的SPI波特率一般只能到36 MHz(SPI1运行于APB2,假设主频72 MHz,APB2也是72 MHz)。直接使用写外设寄存器来通讯的方式已经足够。
  1. #include<inttypes.h>
  2. #include<stm32f10x.h>
  3. #include<system_stm32f10x.h>
  4. #include<stddef.h>

  5. #include"delay.h"
  6. #include"ili9341.h"

  7. #define ILI9341_RCC_APB2Periph_SPIx                        RCC_APB2Periph_SPI1
  8. #define ILI9341_RCC_APB2Periph_GPIOx                RCC_APB2Periph_GPIOA
  9. #define ILI9341_GPIOx                                                GPIOA
  10. #define ILI9341_SPIx                                                SPI1
  11. #define ILI9341_RESET_PIN                                        GPIO_Pin_2
  12. #define ILI9341_DC_PIN                                                GPIO_Pin_3
  13. #define ILI9341_CS_PIN                                                GPIO_Pin_4
  14. #define ILI9341_SCK_PIN                                                GPIO_Pin_5
  15. #define ILI9341_MISO_PIN                                        GPIO_Pin_6
  16. #define ILI9341_MOSI_PIN                                        GPIO_Pin_7
  17. #define ILI9341_LED_PIN                                                GPIO_Pin_8

  18. int ILI9341_XRes;
  19. int ILI9341_YRes;
  20. int ILI9341_bpp;

  21. // 配置外设时钟
  22. static void ILI9341_RCC_Configuration()
  23. {
  24.         RCC_PCLK2Config(RCC_HCLK_Div1);
  25.         RCC_APB2PeriphClockCmd(ILI9341_RCC_APB2Periph_SPIx | ILI9341_RCC_APB2Periph_GPIOx | RCC_APB2Periph_AFIO, ENABLE);
  26. }

  27. // 配置GPIO
  28. static void ILI9341_GPIO_Configuration()
  29. {
  30.         GPIO_InitTypeDef GPIO_InitStructure;
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.        
  33.         GPIO_InitStructure.GPIO_Pin = ILI9341_SCK_PIN | ILI9341_MOSI_PIN;
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  35.         GPIO_Init(ILI9341_GPIOx, &GPIO_InitStructure);
  36.        
  37.         GPIO_InitStructure.GPIO_Pin = ILI9341_MISO_PIN;
  38.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  39.         GPIO_Init(ILI9341_GPIOx, &GPIO_InitStructure);
  40.        
  41.         GPIO_InitStructure.GPIO_Pin = ILI9341_RESET_PIN | ILI9341_DC_PIN | ILI9341_CS_PIN | ILI9341_LED_PIN;
  42.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  43.         GPIO_Init(ILI9341_GPIOx, &GPIO_InitStructure);
  44. }

  45. // 配置SPI
  46. static void ILI9341_SPI_Configuration()
  47. {
  48.         SPI_InitTypeDef SPI_InitStructure;
  49.        
  50.         SPI_StructInit(&SPI_InitStructure);
  51.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  52.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  53.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  54.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  55.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  56.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  57.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  58.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  59.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  60.         SPI_Init(ILI9341_SPIx, &SPI_InitStructure);
  61.         SPI_Cmd(ILI9341_SPIx, ENABLE);
  62. }

  63. // 使用SPI进行传输
  64. static uint32_t ILI9341_SPIx_Transfer(uint32_t data)
  65. {
  66.         while (SPI_I2S_GetFlagStatus(ILI9341_SPIx, SPI_I2S_FLAG_TXE) == RESET);
  67.         SPI_I2S_SendData(ILI9341_SPIx, data);
  68.         while (SPI_I2S_GetFlagStatus(ILI9341_SPIx, SPI_I2S_FLAG_RXNE) == RESET);
  69.         return SPI_I2S_ReceiveData(ILI9341_SPIx);
  70. }

  71. // 等待SPI忙状态
  72. static void ILI9341_SPIx_Flush()
  73. {
  74.         while(SPI_I2S_GetFlagStatus(ILI9341_SPIx, SPI_I2S_FLAG_BSY) == SET);
  75. }

  76. // SPI控制器切到8bit模式
  77. static void ILI9341_SPIx_8bit()
  78. {
  79.         ILI9341_SPIx_Flush();
  80.         SPI_Cmd(ILI9341_SPIx, DISABLE);
  81.         SPI_DataSizeConfig(ILI9341_SPIx, SPI_DataSize_8b);
  82.         SPI_Cmd(ILI9341_SPIx, ENABLE);
  83. }

  84. // SPI控制器切到16bit模式
  85. static void ILI9341_SPIx_16bit()
  86. {
  87.         ILI9341_SPIx_Flush();
  88.         SPI_Cmd(ILI9341_SPIx, DISABLE);
  89.         SPI_DataSizeConfig(ILI9341_SPIx, SPI_DataSize_16b);
  90.         SPI_Cmd(ILI9341_SPIx, ENABLE);
  91. }

  92. //  设置屏幕方向
  93. void ILI9341_SetOrientation(int orient)
  94. {
  95.         uint8_t o;
  96.         switch(orient)
  97.         {
  98.         case 0: // 水平
  99.                 o = 0x28;
  100.                 ILI9341_XRes = 320;
  101.                 ILI9341_YRes = 240;
  102.                 break;
  103.         case 1: // 垂直(默认)
  104.                 o = 0x48;
  105.                 ILI9341_XRes = 240;
  106.                 ILI9341_YRes = 320;
  107.                 break;
  108.         case 2: // 垂直反向
  109.                 o = 0x88;
  110.                 ILI9341_XRes = 240;
  111.                 ILI9341_YRes = 320;
  112.                 break;
  113.         case 3: // 水平反向
  114.                 o = 0xE8;
  115.                 ILI9341_XRes = 320;
  116.                 ILI9341_YRes = 240;
  117.                 break;
  118.         default:
  119.                 return;
  120.         }
  121.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  122.         ILI9341_SPIx_Transfer(0x36);
  123.         ILI9341_SPIx_Flush();
  124.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  125.         ILI9341_SPIx_Transfer(o);
  126.         ILI9341_SPIx_Flush();
  127.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  128. }

  129. // 设置传输的像素格式为RGB565
  130. void ILI9341_Set16bpp()
  131. {
  132.         ILI9341_bpp = 16;
  133.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  134.         ILI9341_SPIx_Transfer(0x3A);
  135.         ILI9341_SPIx_Flush();
  136.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  137.         ILI9341_SPIx_Transfer(0x55);
  138.         ILI9341_SPIx_Flush();
  139.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  140. }

  141. // 设置传输的像素格式为RGB666(实际传输是RGB888,每通道低位会被ILI9341丢弃)
  142. void ILI9341_Set18bpp()
  143. {
  144.         ILI9341_bpp = 18;
  145.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  146.         ILI9341_SPIx_Transfer(0x3A);
  147.         ILI9341_SPIx_Flush();
  148.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  149.         ILI9341_SPIx_Transfer(0x66);
  150.         ILI9341_SPIx_Flush();
  151.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  152. }

  153. // 初始化ILI9341
  154. void ILI9341_Init()
  155. {
  156.         ILI9341_RCC_Configuration();
  157.         ILI9341_GPIO_Configuration();
  158.         ILI9341_SPI_Configuration();
  159.        
  160.         ILI9341_GPIOx->BRR = ILI9341_LED_PIN | ILI9341_RESET_PIN; // 熄灯,重置
  161.         delay_ms(10);
  162.         ILI9341_GPIOx->BSRR = ILI9341_RESET_PIN; // 结束重置,等待初始化
  163.         delay_ms(50);
  164.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN; // 传输命令
  165.         ILI9341_SPIx_Transfer(0x11); // 退出睡眠
  166.         delay_ms(150);
  167.         ILI9341_SPIx_Transfer(0x29); // 开启显示
  168.         ILI9341_SPIx_Flush();
  169.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  170.        
  171.         ILI9341_SetOrientation(1); // 设置朝向
  172.         ILI9341_Set16bpp(); // 设置像素格式(默认18bpp)
  173.        
  174.         ILI9341_GPIOx->BSRR = ILI9341_LED_PIN; // 屏幕亮灯
  175. }

  176. // 垂直滚动
  177. void ILI9341_VScroll(int top, int lines, int dest_y)
  178. {
  179.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  180.         ILI9341_SPIx_Transfer(0x33);
  181.         ILI9341_SPIx_16bit();
  182.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  183.         ILI9341_SPIx_Transfer(top);
  184.         ILI9341_SPIx_Transfer(lines);
  185.         ILI9341_SPIx_Transfer(ILI9341_YRes - top - lines);
  186.         ILI9341_SPIx_8bit();
  187.         ILI9341_GPIOx->BRR = ILI9341_DC_PIN;
  188.         ILI9341_SPIx_Transfer(0x37);
  189.         ILI9341_SPIx_16bit();
  190.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  191.         ILI9341_SPIx_Transfer(dest_y);
  192.         ILI9341_SPIx_8bit();
  193.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  194. }

  195. // 设置地址窗口
  196. void ILI9341_SetAddress(int x1, int y1, int x2, int y2)
  197. {
  198.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  199.         ILI9341_SPIx_Transfer(0x2A);
  200.         ILI9341_SPIx_16bit();
  201.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  202.         ILI9341_SPIx_Transfer(x1);
  203.         ILI9341_SPIx_Transfer(x2);
  204.         ILI9341_SPIx_8bit();
  205.         ILI9341_GPIOx->BRR = ILI9341_DC_PIN;
  206.         ILI9341_SPIx_Transfer(0x2B);
  207.         ILI9341_SPIx_16bit();
  208.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  209.         ILI9341_SPIx_Transfer(y1);
  210.         ILI9341_SPIx_Transfer(y2);
  211.         ILI9341_SPIx_8bit();
  212.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  213. }

  214. // 设置亮度
  215. void ILI9341_SetBrightness(uint8_t brightness)
  216. {
  217.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  218.         ILI9341_SPIx_Transfer(0x51);
  219.         ILI9341_SPIx_Flush();
  220.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  221.         ILI9341_SPIx_Transfer(brightness);
  222.         ILI9341_SPIx_Flush();
  223.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  224. }

  225. // 取得亮度
  226. uint8_t ILI9341_GetBrightness()
  227. {
  228.         uint8_t brightness;
  229.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  230.         ILI9341_SPIx_Transfer(0x52);
  231.         ILI9341_SPIx_Flush();
  232.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  233.         ILI9341_SPIx_Transfer(0);
  234.         brightness = ILI9341_SPIx_Transfer(0);
  235.         ILI9341_SPIx_Flush();
  236.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  237.         return brightness;
  238. }

  239. // 取像素
  240. uint32_t ILI9341_GetPixel(int x, int y)
  241. {
  242.         uint32_t ret = 0;
  243.         if(x < 0 || y < 0 || x >= ILI9341_XRes || y >= ILI9341_YRes) return 0;
  244.        
  245.         ILI9341_SetAddress(x, y, ILI9341_XRes - 1, ILI9341_YRes - 1); // 把x,y当作“起点”
  246.         ILI9341_ReadGRAM(&ret, 1);
  247.         return ret;
  248. }

  249. // 绘制单个像素。慢。
  250. void ILI9341_SetPixel(int x, int y, int r, int g, int b)
  251. {
  252.         if(x < 0 || y < 0 || x >= ILI9341_XRes || y >= ILI9341_YRes) return;
  253.        
  254.         ILI9341_SetAddress(x, y, ILI9341_XRes - 1, ILI9341_YRes - 1); // 把x,y当作“起点”
  255.         ILI9341_WriteGRAMColor(r, g, b, 1);
  256. }

  257. // 读显存
  258. void ILI9341_ReadGRAM(void *ptr, size_t count)
  259. {
  260.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  261.         ILI9341_SPIx_Transfer(0x2E);
  262.         ILI9341_SPIx_Flush();
  263.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  264.         ILI9341_SPIx_Transfer(0); // dummy read
  265.         if(ILI9341_bpp == 16)
  266.         {
  267.                 uint16_t *ptr_16 = ptr;
  268.                 ILI9341_SPIx_16bit();
  269.                 while(count --) *ptr_16 ++ = ILI9341_SPIx_Transfer(0);
  270.                 ILI9341_SPIx_8bit();
  271.         }
  272.         else
  273.         {
  274.                 uint8_t *ptr_8 = ptr;
  275.                 while(count --)
  276.                 {
  277.                         *ptr_8 ++ = ILI9341_SPIx_Transfer(0);
  278.                         *ptr_8 ++ = ILI9341_SPIx_Transfer(0);
  279.                         *ptr_8 ++ = ILI9341_SPIx_Transfer(0);
  280.                 }
  281.                 ILI9341_SPIx_Flush();
  282.         }
  283.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  284. }

  285. // 写显存
  286. void ILI9341_WriteGRAM(void *ptr, size_t count)
  287. {
  288.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  289.         ILI9341_SPIx_Transfer(0x2C);
  290.         ILI9341_SPIx_Flush();
  291.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  292.         if(ILI9341_bpp == 16)
  293.         {
  294.                 uint16_t *ptr_16 = ptr;
  295.                 ILI9341_SPIx_16bit();
  296.                 while(count --) ILI9341_SPIx_Transfer(*ptr_16 ++);
  297.                 ILI9341_SPIx_8bit();
  298.         }
  299.         else
  300.         {
  301.                 uint16_t *ptr_8 = ptr;
  302.                 while(count --)
  303.                 {
  304.                         ILI9341_SPIx_Transfer(*ptr_8 ++);
  305.                         ILI9341_SPIx_Transfer(*ptr_8 ++);
  306.                         ILI9341_SPIx_Transfer(*ptr_8 ++);
  307.                 }
  308.                 ILI9341_SPIx_Flush();
  309.         }
  310.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  311. }

  312. // 向显存里重复写入纯色
  313. void ILI9341_WriteGRAMColor(int r, int g, int b, size_t count)
  314. {
  315.         ILI9341_GPIOx->BRR = ILI9341_CS_PIN | ILI9341_DC_PIN;
  316.         ILI9341_SPIx_Transfer(0x2C);
  317.         ILI9341_SPIx_Flush();
  318.         ILI9341_GPIOx->BSRR = ILI9341_DC_PIN;
  319.         if(ILI9341_bpp == 16)
  320.         {
  321.                 uint16_t color_value =
  322.                         ((r << 8) & 0xF800) |
  323.                         ((g << 3) & 0x07E0) |
  324.                         ((b >> 3) & 0x001F) |
  325.                         0;
  326.                 ILI9341_SPIx_16bit();
  327.                 while(count --) ILI9341_SPIx_Transfer(color_value);
  328.                 ILI9341_SPIx_8bit();
  329.         }
  330.         else
  331.         {
  332.                 while(count --)
  333.                 {
  334.                         ILI9341_SPIx_Transfer(r);
  335.                         ILI9341_SPIx_Transfer(g);
  336.                         ILI9341_SPIx_Transfer(b);
  337.                 }
  338.                 ILI9341_SPIx_Flush();
  339.         }
  340.         ILI9341_GPIOx->BSRR = ILI9341_CS_PIN;
  341. }

  342. // 读取像素,注意SPI频率必须不能高于24 MHz
  343. size_t ILI9341_ReadPixels(int x, int y, int w, int h, void *ptr)
  344. {
  345.         size_t count;
  346.         size_t cb;
  347.         if(x < 0)
  348.         {
  349.                 w += x;
  350.                 if(w < 1) return 0;
  351.                 x = 0;
  352.         }
  353.         else if(x >= ILI9341_XRes) return 0;
  354.         if(y < 0)
  355.         {
  356.                 h += y;
  357.                 if(h < 1) return 0;
  358.                 y = 0;
  359.         }
  360.         else if(y >= ILI9341_YRes) return 0;
  361.         if(x + w > ILI9341_XRes) w = ILI9341_XRes - x;
  362.         if(y + h > ILI9341_YRes) h = ILI9341_YRes - y;
  363.        
  364.         count = w * h;
  365.         cb = count * (ILI9341_bpp == 16 ? 2 : 3);
  366.         if(!ptr) return cb;
  367.        
  368.         ILI9341_SetAddress(x, y, x + w - 1, y + h - 1);
  369.         ILI9341_ReadGRAM(ptr, count);
  370.         return cb;
  371. }

  372. // 写像素,SPI频率可以很高
  373. size_t ILI9341_WritePixels(int x, int y, int w, int h, void *ptr)
  374. {
  375.         size_t count;
  376.         size_t cb;
  377.         if(x < 0)
  378.         {
  379.                 w += x;
  380.                 if(w < 1) return 0;
  381.                 x = 0;
  382.         }
  383.         else if(x >= ILI9341_XRes) return 0;
  384.         if(y < 0)
  385.         {
  386.                 h += y;
  387.                 if(h < 1) return 0;
  388.                 y = 0;
  389.         }
  390.         else if(y >= ILI9341_YRes) return 0;
  391.         if(x + w > ILI9341_XRes) w = ILI9341_XRes - x;
  392.         if(y + h > ILI9341_YRes) h = ILI9341_YRes - y;
  393.        
  394.         count = w * h;
  395.         cb = count * (ILI9341_bpp == 16 ? 2 : 3);
  396.         if(!ptr) return cb;
  397.        
  398.         ILI9341_SetAddress(x, y, x + w - 1, y + h - 1);
  399.         ILI9341_WriteGRAM(ptr, count);
  400.         return cb;
  401. }

  402. // 填充矩形区域,给两个对角坐标
  403. void ILI9341_FillRect(int x1, int y1, int x2, int y2, int r, int g, int b)
  404. {
  405.         if(x2 < x1) {int t = x1; x1 = x2; x2 = t;}
  406.         if(y2 < y1) {int t = y1; y1 = y2; y2 = t;}
  407.         if(x1 < 0) x1 = 0; else if(x1 > ILI9341_XRes - 1) x1 = ILI9341_XRes - 1;
  408.         if(x2 < 0) x2 = 0; else if(x2 > ILI9341_XRes - 1) x2 = ILI9341_XRes - 1;
  409.         if(y1 < 0) y1 = 0; else if(y1 > ILI9341_YRes - 1) y1 = ILI9341_YRes - 1;
  410.         if(y2 < 0) y2 = 0; else if(y2 > ILI9341_YRes - 1) y2 = ILI9341_YRes - 1;
  411.        
  412.         ILI9341_SetAddress(x1, y1, x2, y2);
  413.         ILI9341_WriteGRAMColor(r, g, b, (x2 + 1 - x1) * (y2 + 1 - y1));
  414. }

  415. // 填充矩形区域,给左上角坐标和矩形宽高
  416. void ILI9341_FillRect2(int x, int y, int w, int h, int r, int g, int b)
  417. {
  418.         if(x < 0)
  419.         {
  420.                 w += x;
  421.                 if(w < 1) return;
  422.                 x = 0;
  423.         }
  424.         else if(x >= ILI9341_XRes) return;
  425.         if(y < 0)
  426.         {
  427.                 h += y;
  428.                 if(h < 1) return;
  429.                 y = 0;
  430.         }
  431.         else if(y >= ILI9341_YRes) return;
  432.         if(x + w > ILI9341_XRes) w = ILI9341_XRes - x;
  433.         if(y + h > ILI9341_YRes) h = ILI9341_YRes - y;
  434.        
  435.         ILI9341_SetAddress(x, y, x + w - 1, y + h - 1);
  436.         ILI9341_WriteGRAMColor(r, g, b, w * h);
  437. }
复制代码
事实上,ILI9341_GetPixel()和ILI9341_ReadPixels()经过实际测试并不能正确运行。不知道是因为什么的原因。我试着将SPI的波特率降低到0.5 MHz都不行。它的表现是:当你把手指放在MISO线的金属部分的时候,读到的就全是0xFF;而当你不去触摸MISO线的时候,它的表现甚至犹如CSPRNG一样“优秀”。估计和我买的这款屏幕本身的组装设计有关,因为ILI9341本身并不是只能用SPI进行传输的,它其实支持不止一种协议。
回复

使用道具 举报

发表于 2018-11-20 18:16:17 | 显示全部楼层
我发现,帖子怎么好像都是你发的?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-21 02:58:37 | 显示全部楼层
Si515 发表于 2018-11-20 18:16
我发现,帖子怎么好像都是你发的?

别人发的也有
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 18:13 , Processed in 0.037290 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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