数码之家

 找回密码
 立即注册
搜索
查看: 1038|回复: 14

[Arduino] 请教一个arduino-ESP8266的SPI程序问题

[复制链接]
发表于 2022-7-14 10:24:46 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2022-7-14 10:24 编辑

最近在玩一块SPI接口的彩屏、480*320点ILI9481驱动,这块彩屏之前已经用STC15W408AS单片机I/O模拟SPI正常驱动成功了,想用ESP8266驱动就出现了问题,问题是不能全屏显示颜色,这个屏的SPI是在8位数据之前加了1位数据来代替标准4线SPI的RS(D/C)信号,也就是说他是一个9bit串口SPI发送的模式,常见的8位总线的硬件SPI是无法驱动的,数据手册上有一段话描述了其总线特征:

During the write sequence the host processor writes one or more bytes of information to the display module via
the interface. The write sequence is initiated when CSX is driven from high to low and ends when CSX is pulled
high. Each byte is either nine or sixteen write cycles in length. If the optional D/CX signal is used a byte is eight
write cycles long. D/CX is driven low while command information is on the interface and is pulled high when data
is present.


这是它的时序图:



我不懂鸟语,使用Google在线翻译,其中有一句为:“每个字节的长度为 9 或 16 个写周期。 如果使用可选的 D/CX 信号,则一个字节为 8个写周期”,由此看来它可以使用16位硬件SPI驱动的,通过ESP8266 arduino的16位SPI印证属实是可以驱动的,程序如下:

  1. //====写指令函数============================
  2. void write_command(uint8_t command)
  3. {  
  4. uint16_t dat;
  5. dat=command;
  6. dat=(dat<<7)&0x7fff;//第一位是D/C指令、数据高位先行
  7. digitalWrite(cs,LOW);
  8. SPI.transfer16(dat);
  9. digitalWrite(cs,HIGH);
  10. }
复制代码


  1. //====写8位数据函数===========================
  2. void write_data(uint8_t tdata)
  3. {  
  4. uint16_t dat;
  5. dat=tdata;
  6. dat=(dat<<7)|0x8000;
  7. digitalWrite(cs,LOW);
  8. SPI.transfer16(dat);
  9. digitalWrite(cs,HIGH);
  10. }
复制代码
  1. //====写24位数据函数============================
  2. void lcd_wr_data(uint32_t da)
  3. {
  4. uint8_t temp1,temp2,temp3;
  5. temp1=(uint8_t)(da>>16);
  6. temp2=(uint8_t)(da>>8);
  7. temp3=(uint8_t)da;
  8. write_data(temp3);
  9. write_data(temp2);
  10. write_data(temp1);
  11. }
复制代码
  1. //====LCD显示定位函数=========================
  2. void lcd_SetPos(uint16_t x0,  uint16_t x1, uint16_t y0, uint16_t y1)
  3. {
  4.    write_command(0x2A);
  5.    write_data((uint8_t)(x0>>8));
  6.    write_data((uint8_t)x0);
  7.    write_data((uint8_t)(x1>>8));
  8.    write_data((uint8_t)x1);
  9.   
  10.    write_command(0x2B);
  11.    write_data((uint8_t)(y0>>8));
  12.    write_data((uint8_t)y0);
  13.    write_data((uint8_t)(y1>>8));
  14.    write_data((uint8_t)y1);

  15.    write_command(0x2c);
  16. }
  17. //====清空屏幕(屏幕显示单一颜色)函数===========
  18. void Show_RGB (uint16_t x0,uint16_t x1,uint16_t y0,uint16_t y1,uint32_t color)
  19. {
  20. unsigned int i,j;
  21. lcd_SetPos(x0,x1-1,y0,y1-1);
  22.   for (i=y0;i<=y1;i++)
  23.      {
  24.       for (j=x0;j<=x1;j++)
  25.         {lcd_wr_data(color);}
  26.      }
  27. }
复制代码




上述代码横屏可以显示颜色但不正常!现象为只能显示110多行666(18bit)色点像素,不能拉满全屏,并且此后处于死机状态不再执行其他显示了。

为了验证是否是变量设置的值域问题,又做了竖条显示,现象为可以显示高度320宽度不超过220的矩形竖条。
接下来也进行了I/O模拟SPI驱动的测试,但仍然不能全屏显示,相必硬件SPI可以显示的面积有少了很多。
因为不熟悉arduino编程,想不明白这是什么问题,请各位遇到过此类问题的坛友指点一下,先谢了!


下图是ESP8266模拟SPI显示的图片,显示宽度应该在80线左右。



本帖子中包含更多资源

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

x
发表于 2022-7-14 11:03:25 | 显示全部楼层
有几个函数中传参是 uint8_t   后面使用中却是 uint16_t  这个数据长度不一致会不会导致有些数据丢失了
回复 支持 反对

使用道具 举报

发表于 2022-7-14 12:51:58 | 显示全部楼层
感觉是定位偏移了,清屏的坐标加100看看范围有没有增加?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-14 17:55:44 | 显示全部楼层
zhonsir 发表于 2022-7-14 11:03
有几个函数中传参是 uint8_t   后面使用中却是 uint16_t  这个数据长度不一致会不会导致有些数据丢失了
...

多谢顶贴指点,数据传递过程中我都进行强制转换了,最终带回函数执行的数据仍然是8位的,其实在用C51单片机的时候没进行任何处理也没啥问题的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-14 18:05:46 | 显示全部楼层
chenghelin 发表于 2022-7-14 12:51
感觉是定位偏移了,清屏的坐标加100看看范围有没有增加?

多谢,这个问题都测试过了,可以在任意位置画“一定大小”的色块,比如横向480宽、纵向100至200就会在相应的位置显示一个横条,这种显示是正常的。
回复 支持 反对

使用道具 举报

发表于 2022-7-15 11:00:02 | 显示全部楼层
本帖最后由 茶壹杯 于 2022-7-15 11:15 编辑

这个貌似需要9位驱动?8位怕是不够用
用16位又比较浪费

回复 支持 反对

使用道具 举报

发表于 2022-7-15 11:21:20 | 显示全部楼层
本帖最后由 inthsunshine 于 2022-7-15 11:31 编辑

它的意思是,如果不使用D/CX线(节省一根线),必须用9位发送,  如果象常规的包含D/CX线, 那么就是8位模式, 这个模式选择由LCD主控芯片硬件设置
如果cpu 是stm32F0 系列, 它的spi 位宽可以4-16位, 9位是没问题的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-15 18:52:01 | 显示全部楼层
茶壹杯 发表于 2022-7-15 11:00
这个貌似需要9位驱动?8位怕是不够用
用16位又比较浪费

确实是需要9位驱动的,我用STC15模拟9位发送已经实现控制了,现在的问题是用esp8266模拟9位发送就不成功了,因为对arduino编程不熟悉就找不出原因了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-15 18:54:21 | 显示全部楼层
inthsunshine 发表于 2022-7-15 11:21
它的意思是,如果不使用D/CX线(节省一根线),必须用9位发送,  如果象常规的包含D/CX线, 那么就是8位模式, 这 ...

现在用硬件16位也可以发送数据,除了不能整屏显示颜色,其他的文字等显示都是正常的,我即不懂arduino编程也不熟悉LCD的驱动芯片,所有搞不懂了。
回复 支持 反对

使用道具 举报

发表于 2022-7-15 21:41:11 | 显示全部楼层
慕名而来 发表于 2022-7-15 18:52
确实是需要9位驱动的,我用STC15模拟9位发送已经实现控制了,现在的问题是用esp8266模拟9位发送就不成功 ...

7楼TX的理解应该是对的   增加1线效率最高
找相似的驱动看看

回复 支持 反对

使用道具 举报

发表于 2022-7-16 18:16:21 来自手机浏览器 | 显示全部楼层
这不是四线SPI看着是三线spi,8266好像不能用9位数据。改成4线spi通信,然后再用8位SPI发数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 08:38:52 | 显示全部楼层
1065307738 发表于 2022-7-16 18:16
这不是四线SPI看着是三线spi,8266好像不能用9位数据。改成4线spi通信,然后再用8位SPI发数据。 ...

多谢,TFT接口是内定的无法改造,如果是4线SPI就方便了。
回复 支持 反对

使用道具 举报

发表于 2022-7-18 17:32:14 来自手机浏览器 | 显示全部楼层
感觉用8266驱动TFT很蛋疼…速度跟8952差不多都是一样的拉窗帘…今天玩了一下mixly局限性有点大…不过比arduino容易点…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-19 10:21:35 | 显示全部楼层
触景情伤 发表于 2022-7-18 17:32
感觉用8266驱动TFT很蛋疼…速度跟8952差不多都是一样的拉窗帘…今天玩了一下mixly局限性有点大…不过比ardu ...

确实如此,我现在碰到的问题是用8266驱动慢我也忍了,但竟然连窗帘也拉不满了就没法弄了,也是这个屏买的不好,因为用过几次硬件SPI感觉挺爽的,只以为SPI驱动都是一样的,没想到还有这种三线(无D/C)驱动的,以后买屏要多注意了买不好就是无底的坑。
回复 支持 反对

使用道具 举报

发表于 2022-7-19 13:38:37 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2022-7-19 10:21
确实如此,我现在碰到的问题是用8266驱动慢我也忍了,但竟然连窗帘也拉不满了就没法弄了,也是这个屏买的 ...

我的都是批量的和其他的不怎么兼容…比如说一个7735的在mixly上只能用7789驱动…
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-25 10:51 , Processed in 0.374401 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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