硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7013|回复: 20
收起左侧

[技术讨论] ST7789V SPI 4线接口 无法读取 ID ?

  [复制链接]

27

主题

272

回帖

353

积分

高级会员

积分
353
发表于 2021-5-31 09:37:44 | 显示全部楼层 |阅读模式
ST7789V   SPI 4线接口 无法读取 ID ?

读 ID 时序 难道是我 写的不对?

先发 命令 0x04;

然后发送 4个 数据,读回来4个数据 ,怎么读都不对 ……
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2021-5-31 09:40:28 | 显示全部楼层
楼主稍传点程序看下。
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2021-5-31 10:04:46 | 显示全部楼层
  1.   read_id_buff[0] = lcd_write_byte( 0x04, LCD_CMD );
  2.                 read_id_buff[1] = lcd_write_byte( 0xFF, LCD_DATA );
  3.                 read_id_buff[2] = lcd_write_byte( 0xFF, LCD_DATA );
  4.                 read_id_buff[3] = lcd_write_byte( 0xFF, LCD_DATA );
  5.                 read_id_buff[4] = lcd_write_byte( 0xFF, LCD_DATA );
复制代码
  1. /******************************************************************************
  2. function :        write eight bits' data to LCD
  3. parameter:
  4.   chByte : send data
  5.   chCmd  : command or data
  6. ******************************************************************************/
  7. uint8_t lcd_write_byte(uint8_t chByte, uint8_t chCmd)
  8. {
  9.        
  10.         uint8_t value = 0;
  11.        
  12.     if (chCmd)
复制代码


回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2021-5-31 10:28:18 | 显示全部楼层

手册上 读取 ID 的 时序

下载.png
回复

使用道具 举报

0

主题

214

回帖

214

积分

高级会员

积分
214
发表于 2021-5-31 11:33:21 | 显示全部楼层
发送完指令后,只要有时钟信号,就可以读取了,而不是发送数据再读取。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2021-5-31 11:44:41 | 显示全部楼层
suozhang 发表于 2021-5-31 10:28
手册上 读取 ID 的 时序

这段程序看不出问题来,

是不是你的SPI配置有问题。
回复

使用道具 举报

75

主题

681

回帖

906

积分

金牌会员

积分
906
发表于 2021-5-31 14:51:38 | 显示全部楼层
第一步先挂个逻辑分析仪看看自己的SPI配置正不正确,或者上全部代码,大家才能帮你。
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2021-6-1 09:44:27 | 显示全部楼层
庄永 发表于 2021-5-31 14:51
第一步先挂个逻辑分析仪看看自己的SPI配置正不正确,或者上全部代码,大家才能帮你。

屏幕可以 正常显示,但是读取 ID ,读不出来 … 尴尬
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2021-6-1 09:44:49 | 显示全部楼层
regbbs 发表于 2021-5-31 11:33
发送完指令后,只要有时钟信号,就可以读取了,而不是发送数据再读取。

嗯 嗯 好的 多谢
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2021-6-1 09:46:05 | 显示全部楼层
  1. uint8_t lcd_write_byte(uint8_t chByte, uint8_t chCmd)
  2. {

  3.         uint8_t value = 0;

  4.     if( chCmd == e_lcd_cmd )
  5.     {
  6.                 bsp_gpio_set( LCD_DATA_CMD_IO, e_lcd_cmd );
  7.     } else
  8.     {
  9.             bsp_gpio_set( LCD_DATA_CMD_IO, e_lcd_data );
  10.     }

  11.     spi1_tx_buff[0] = chByte; // 赋值 数据

  12.     value = bsp_spi1_tx_rx( spi1_tx_buff, spi1_rx_buff, 1 );

  13.         return value;
  14. }
复制代码
  1. uint32_t bsp_st7789_read_id( void )
  2. {
  3.         uint32_t value = 0;

  4.         uint8_t buff[4] = {0};

  5.         buff[0] = lcd_write_byte( 0xDA, e_lcd_cmd );

  6.         buff[1] = lcd_write_byte( 0xFF, e_lcd_data );
  7.         buff[2] = lcd_write_byte( 0xFF, e_lcd_data );
  8.         buff[3] = lcd_write_byte( 0xFF, e_lcd_data );

  9.         if( buff[1] == 0x85 )
  10.                 return 0;

  11.         value = (buff[1]<<16) + (buff[2]<<8) +(buff[3]<<0);
  12.         return value;


  13. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2021-6-2 10:25:08 | 显示全部楼层
楼主的问题解决了吗
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2021-6-2 11:19:38 | 显示全部楼层
我用过这种液晶,也是SPI的方式,可以读取。 参考我这个帖子的代码。http://www.armbbs.cn/forum.php?m ... id=99466&extra=
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-12-1 11:07:00 | 显示全部楼层
请问楼主解决问题了吗?
ST7789和ILI9341的寄存器几乎一样!
我使用ILI9341也遇到 SPI 4线接口写入显示都正常,就是无论如何,都读取不了ID,读取ID1、ID2、ID3都返回0,读取ID4(0x04寄存器)返回FFFFFF,跟楼之一样的问题,读取像素点(0x2e)时屏幕死机了,要重新初始化才行
读取其它寄存器,比如0x0a,能正确返回8,符合规格书的默认值,硬件和读取函数应该是无问题的
ID读不到没所谓,我想读像素点数据。无奈啊

https://flandreblog.lofter.com/post/2a8940_144f2a9按照这个帖子的改无效

https://www.amobbs.com/thread-5622740-1-1.html这个帖子我下载不了,有朋友帮下载过来吗?谢谢

回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-18 15:25:19 | 显示全部楼层
也不知楼主解决没有,我调ST7789V2的TFTLCD也有类似的问题,读写数据是对的,LCD显示正常。但读ID就是不对。用04指令读,手册给的值是858552,读到的是42C2A9刚好差一位,但是用单字节DA指令读的到是85。
参考代码:
u32 Read_ID(u8 cmd)
{
    u8 tmp;
    u32 temp=0;
    LCD_DC_0;                   //这个是命令
    LCD_CS_0;                   //选择LCD
    SPI_ReadWriteByte(cmd);     //发送命令字节
    LCD_DC_1;                   //这个是数据
#ifdef SPI2_DMA
    SPI2_TX_BUFFER[0]=0xff;
    SPI2_TX_BUFFER[1]=0xff;
    SPI2_TX_BUFFER[2]=0xff;
    SPI2_TX_BUFFER[3]=0xff;
    SPI2_transmission(SPI2_RX_BUFFER,SPI2_TX_BUFFER,4);
    tmp=SPI2_RX_BUFFER[1];
    temp|=tmp;
    tmp=SPI2_RX_BUFFER[2];
    temp=temp<<8;
    temp|=tmp;
    tmp=SPI2_RX_BUFFER[3];
    temp=temp<<8;
    temp|=tmp;
#else
    SPI2_RX_BUFFER[0]=SPI_ReadWriteByte(0xff);
    temp|=SPI2_RX_BUFFER[0];
    SPI2_RX_BUFFER[1]=SPI_ReadWriteByte(0xff);
    temp=temp<<8;
    temp|=SPI2_RX_BUFFER[1];
    SPI2_RX_BUFFER[2]=SPI_ReadWriteByte(0xff);
    temp=temp<<8;
    temp|=SPI2_RX_BUFFER[2];
#endif
    LCD_CS_1;                   //取消片选
    return temp;
}

下面的是单字节读的:
u8 Read_ID1(u8 cmd)
{
    u8 tmp;
    LCD_DC_0;                   //这个是命令
    LCD_CS_0;                   //选择LCD
    tmp=SPI_ReadWriteByte(cmd); //发送命令字节
    LCD_DC_1;                   //这个是数据
        tmp=SPI_ReadWriteByte(0xa5);
    tmp=SPI_ReadWriteByte(0xa5);
    LCD_CS_1;                   //取消片选
    return tmp;
}

回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
发表于 2023-8-25 19:10:06 | 显示全部楼层
楼主问题解决了没
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2023-8-28 09:26:10 | 显示全部楼层
木兰花 发表于 2023-8-25 19:10
楼主问题解决了没

没有 后面不读取 ID 了
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2023-8-28 09:27:10 | 显示全部楼层
eric2013 发表于 2021-6-2 10:25
楼主的问题解决了吗

不好意思 回复晚了 没有解决, 不能读取 ID
回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
发表于 2023-8-28 10:43:49 | 显示全部楼层
suozhang 发表于 2023-8-28 09:26
没有 后面不读取 ID 了

嗯,那我试试,读不到也不读了
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-10-27 10:43:06 | 显示全部楼层
@14#    仔细看一下手册就知道读命令和数据之间会有一个  dummy clock cycle ,所以读到的数据刚好右移了
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-10-27 10:54:39 | 显示全部楼层
[C] 纯文本查看 复制代码
static void soft_spi_write_data(u16 data, u8 len) {
  LCD_SDA_OUT();
  for (u8 i = 0; i < len; i++) {
    LCD_CLK_L();
    if (data & BIT(len - 1)) {
      LCD_SDA_H();
    } else {
      LCD_SDA_L();
    }
    SS_DELAY();
    LCD_CLK_H();
    data <<= 1;
    SS_DELAY();
  }
  LCD_CLK_L();
}

static u32 soft_spi_read_data(u8 dummy_cnt, u8 len) {
   u32 temp = 0;
   u8 i = 0;
    LCD_SDA_IN();
	for (i = 0; i < dummy_cnt; ){
		LCD_CLK_L();
		SS_DELAY();
		LCD_CLK_H();
		i++;
	}
  for (i = 0; i < len; ) {
    LCD_CLK_L();
    SS_DELAY();
    temp <<= 1;
    if (gpio_read(IO_LCD_SDA)) {
      temp |= 0x000001;
    } else {
      temp &= 0xfffffe;
    }
    LCD_CLK_H();
    ++i;
    SS_DELAY();
  }
  LCD_CLK_L();
  LCD_SDA_OUT();
  return temp;
}
bool lcd_nv3022_Check_id(void){
	u32 temp = 0;
	printf("lcd_nv3022_Check_id\n");
    LCD_RESET_H();
    LCD_RS_L();
    soft_spi_init();
    mdelay(2);

    LCD_CS_L();
    LCD_RS_L();
    soft_spi_write_data(0x04, 8);
    LCD_RS_H();
	temp = soft_spi_read_data(0x01, 24);
    LCD_CS_H();
    printf("nv3022 id 0x%x\n",temp);

	return (0x00333023 == (temp & 0x00ffffff));
}

读不到id基本都是因为发完命令的时候将cs拉高了,发数据的时候再将cs拉低,这样读到的id肯定是不对的,一定要数据都读完才允许拉高cs
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-10-27 16:51:01 | 显示全部楼层
lsw900822 发表于 2023-10-27 10:43
@14#    仔细看一下手册就知道读命令和数据之间会有一个  dummy clock cycle ,所以读到的数据刚好右移了

谢谢你. 有机会试试看(项目已交货).
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 04:23 , Processed in 0.228487 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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