USMI

Объявление

12/06/2025 (Administration) - Spamming for the purpose of boosting messages will be punished with a ban. Спам с целью накрутки сообщений будет караться баном.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...


Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...

Сообщений 141 страница 160 из 187

141

barbaror4 написал(а):

Итак, мой план — использовать стандартный SDK 2.6.3 вместо BT201, напишу собственную библиотеку инициализации/GDRAM для ST7920 или для LCD-дисплея или LCD12864. ADK работает на PA3, светодиодный индикатор использовать не буду, так что PB3, PB4, PB5 и PB0 будут свободны для использования!

Нету ни какого SDK для BT201. Это просто настроенный под эту плату - стандартный SDK 2.6.3.

barbaror4 написал(а):

Здравствуйте! Интересует возможность использования ЖК-дисплея ST7920 с этим устройством, поскольку он у меня уже есть. Но если для него нет готовых библиотек, я куплю SSD1306 I2C. (К Bt201/AC6925B4 )(будет использовать английский язык)
Спасибо

Если буфер и адресация у ST7920 такая же как у уже используемого ST7567 - то достаточно просто переделать процесс инициализации. Как сделоно было для OLED 12864 SSD1306/SSD1306/SH1106/ETC - достаточно переделать инициализацию.
Можно сэкономить один GPIO - RES можно сделать хардварно использовав RC цепь.
Для SPI достаточно использовать 3 GPIO.

Подпись автора

USMicro® 2026©

142

BIOS написал(а):

There's no SDK for the BT201. It's just the standard SDK 2.6.3, customized for this board.

If the ST7920's buffer and addressing are the same as the ST7567 you're already using, then simply redoing the initialization process is sufficient. As was done for the OLED 12864 SSD1306/SSD1306/SH1106/ETC, redoing the initialization is sufficient.
You can save one GPIO by implementing RES in hardware using an RC circuit.
For SPI, three GPIOs are sufficient.

Значит, достаточно будет отредактировать только файл 12864.c вместе с файлом lcd_drv_interface.c?

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

143

barbaror4 написал(а):

So, it will be enough to edit only the 12864.c file together with the lcd_drv_interface.c file?

Похоже, что ST7920 — это драйвер 64x64.(В моём ЖК-дисплее с разрешением 128x64 используются 2 таких чипа.) Поэтому, если я не ошибаюсь, адресация GDRAM будет выглядеть так: горизонтальная GDRAM1 0-31, GDRAM2 31-63. Возможно, стоит отредактировать буфер/GDRAM вместе с инициализацией.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

144

barbaror4 написал(а):

Значит, достаточно будет отредактировать только файл 12864.c вместе с файлом lcd_drv_interface.c?

Теоретически да, я давно не работал уже с дисплеями и 692 чипами.
Вот достал из хлама, нужно соорудить плеер на ac6925a и oled дисплее. Или даже я попробую написать нормальный i2c драйвер без блокирующих задержек и глюков)
https://upforme.ru/uploads/001b/ca/8a/2/t370040.jpg

Подпись автора

USMicro® 2026©

145

barbaror4 написал(а):

Похоже, что ST7920 — это драйвер 64x64.(В моём ЖК-дисплее с разрешением 128x64 используются 2 таких чипа.) Поэтому, если я не ошибаюсь, адресация GDRAM будет выглядеть так: горизонтальная GDRAM1 0-31, GDRAM2 31-63. Возможно, стоит отредактировать буфер/GDRAM вместе с инициализацией.

Да, но тут есть проблема, тогда не хватает пинов для CS. Если я не ошибаюсь, там нужно переключать CS для каждого банка памяти.

Подпись автора

USMicro® 2026©

146

BIOS написал(а):

Theoretically, yes. I haven't worked with displays and 692 chips in a while.
I just dug this one out of the trash and need to build a player using an AC6925A and an OLED display. Or I might even try writing a decent I2C driver without blocking delays and glitches.

Спасибо за помощь, я попробую.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

147

BIOS написал(а):

Yes, but there's a problem: there aren't enough pins for the CS. If I'm not mistaken, you need to switch the CS for each memory bank.

Требуются только следующие контакты: RS, RW, E, RST. RS отвечает за CS, E — за SCLK/CLK, RW — за MISO/SIDO.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

148

barbaror4 написал(а):

Требуются только следующие контакты: RS, RW, E, RST. RS отвечает за CS, E — за SCLK/CLK, RW — за MISO/SIDO.

Но CS там должно быть три ? Там же три микросхемы же на плате дисплея?

Подпись автора

USMicro® 2026©

149

BIOS написал(а):

But there should be three CS there? There are three microcircuits on the display board, right?

ST7920 — странный микросхема, это что-то вроде трехпроводного гибридного последовательного интерфейса. В нем три микросхемы: две ST7920 и одна ОЗУ или EEPROM для китайских символов или просто буфер (интересно, что в документации указано, что там китайские символы). Я пробовал этот ЖК-дисплей с STM32, подключил RS, RW, E, RST, и все работало нормально. PSB установлен на землю для последовательного порта. Единственная проблема, как я уже говорил, заключается в том, что ST7920 не является полноценным драйвером 128x64, поэтому мне придется уменьшить буферы вдвое.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

150

Теперь будет проще прикреплять вещи.  :glasses: https://upforme.ru/uploads/001b/ca/8a/339/t981655.jpg
https://upforme.ru/uploads/001b/ca/8a/339/t893732.jpg

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

151

barbaror4 написал(а):

ST7920 — странный микросхема, это что-то вроде трехпроводного гибридного последовательного интерфейса. В нем три микросхемы: две ST7920 и одна ОЗУ или EEPROM для китайских символов или просто буфер (интересно, что в документации указано, что там китайские символы). Я пробовал этот ЖК-дисплей с STM32, подключил RS, RW, E, RST, и все работало нормально. PSB установлен на землю для последовательного порта. Единственная проблема, как я уже говорил, заключается в том, что ST7920 не является полноценным драйвером 128x64, поэтому мне придется уменьшить буферы вдвое.

Понял.

barbaror4 написал(а):

Теперь будет проще прикреплять вещи.

Если есть лазерный принтер, то можно изготовить что то типа такого
JL SoC Develop Board  (杰理芯片)
https://upforme.ru/uploads/001b/ca/8a/2/t363559.jpg
https://upforme.ru/uploads/001b/ca/8a/2/t420239.jpg

Подпись автора

USMicro® 2026©

152

BIOS написал(а):

Understood.

If you have a laser printer, you can make something like this
JL SoC Develop Board (杰理芯片)

К сожалению, в моей стране эти лазерные станки очень дорогие, поэтому я делаю это с тем, что есть. Возможно, я попробую напечатать схему печатной платы на алюминиевой фольге, затем протравить медное покрытие с помощью нагрева и окунуть его в раствор соляной кислоты и перекиси водорода (на будущее).

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

153

barbaror4 написал(а):

в моей стране эти лазерные станки очень дорогие

Можно печатать на специальной бумаге в фотоцентрах. Обычный лазерный принтер , например HP LaserJet p1102.

Подпись автора

USMicro® 2026©

154

BIOS написал(а):

You can print on special paper at photo centers. A regular laser printer, such as the HP LaserJet p1102, will do.

У меня есть принтер HP LaserJet! Я попробую его в будущем, и если этот прототип, который я создаю, сработает, я думаю сделать его постоянным продуктом.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

155

Я внес следующие изменения в файлы: lcd128X64.h, lcd128X64.c, lcd_drv_interface.h, lcd_drv_interface.c, lcd_drv_api.c

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

156

lcd128x64.h

Код:
#ifndef _LCD128X64_H_
#define _LCD128X64_H_
#include "sdk_cfg.h"

/* ST7920 Command Set (Serial Mode) */
#define ST7920_CMD_BASIC_ON   0x30  // Basic instruction set
#define ST7920_CMD_DISP_ON    0x0C  // Display ON, Cursor OFF
#define ST7920_CMD_CLEAR      0x01  // Clear display
#define ST7920_CMD_ENTRY_MODE 0x06  // Cursor auto-increment
#define ST7920_CMD_HOME       0x02  // Return home
#define ST7920_CMD_EXT_GRAPH  0x34  // Extended instruction + Graphics ON

/* GPIO Pin Mapping: PB0=RST, PB3=RS, PB4=E(CLK), PB5=RW(DATA) */

#define LCD_RS_H()    gpio_set(GPIO_PORT_B, GPIO_PIN_3, 1)
#define LCD_RS_L()    gpio_set(GPIO_PORT_B, GPIO_PIN_3, 0)
#define LCD_E_H()     gpio_set(GPIO_PORT_B, GPIO_PIN_4, 1)
#define LCD_E_L()     gpio_set(GPIO_PORT_B, GPIO_PIN_4, 0)
#define LCD_RW_H(v)   gpio_set(GPIO_PORT_B, GPIO_PIN_5, v)
#define LCD_RES_H()   gpio_set(GPIO_PORT_B, GPIO_PIN_0, 1)
#define LCD_RES_L()   gpio_set(GPIO_PORT_B, GPIO_PIN_0, 0)

extern u8 lcd_contrast;
void lcd_hardware_init(void);
void lcd_set_contrast(u8 c);
#endif /* _LCD128X64_H_ */

lcd128x64.c

Код:
#include "sdk_cfg.h"
#include "ui/lcd/lcd128X64.h"
#include "ui/lcd/lcd_drv_interface.h"
#include "ui/lcd/lcd_drv_api.h"
#include "ui/ui_api.h"
#include "common/common.h"
#include "common/flash_api.h"

#if LCD_128X64_EN
u8 lcd_contrast = 0;

/* ST7920 Initialization Sequence */
const u8 lcd_init_table[] = {
    ST7920_CMD_BASIC_ON,   // 0x30 Basic instruction set
    ST7920_CMD_DISP_ON,    // 0x0C Display ON, Cursor OFF
    ST7920_CMD_CLEAR,      // 0x01 Clear display
    ST7920_CMD_ENTRY_MODE, // 0x06 Auto-increment address
    ST7920_CMD_HOME,       // 0x02 Return home
    ST7920_CMD_EXT_GRAPH,  // 0x34 Extended set + Graphics ON (Required for GDRAM)
};

/* ST7920 serial mode does NOT support software contrast. Use external V0 pot. */
void lcd_set_contrast(u8 c) { (void)c; }

void lcd_hardware_init(void)
{
    u8 i = 0;
    ui_puts("lcd_hardware_init\r\n");
    lcd_spi_init(); // Now configures GPIOs instead of SPI
    
    for (i = 0; i < sizeof(lcd_init_table); i++) {
        lcd_sendcmd(lcd_init_table[i]);
        delay(5);
    }
    
    lcd_clear();
    ui_puts("lcd_hardware_init OK\r\n");
}
#endif /* LCD_128X64_EN */

lcd_drv_interface.h

Код:
#ifndef __LCD_DRV_INTERFACE_H__
#define __LCD_DRV_INTERFACE_H__
#include "sdk_cfg.h"

void lcd_clear_area(u8 start_page, u8 end_page);
void lcd_clear_area_with_draw(u8 start_page, u8 end_page);
void lcd_clear_area_rect(u8 start_page, u8 end_page, u8 x0, u8 x1);
u32 lcd_TurnPixelReverse_Page(u8 startpage, u8 pagelen);
u32 lcd_TurnPixelReverse_Rect(u8 left, u8 top, u8 right, u8 bottom);
void lcd_sendcmd(u8 cmd);
void lcd_draw(u8 start_page, u8 page_len, u8 *pbuf);
u32  lcd_write_dma(u8 *pbuf);
void lcd_spi_init(void);
void lcd_set(u8 page, u8 column);
void lcd_set_XY(u8 x, u8 y);

#endif /* __LCD_DRV_INTERFACE_H__ */

lcd_drv_interface.c

Код:
#include "sdk_cfg.h"
#include "common/common.h"
#include "ui/lcd/lcd_drv_interface.h"
#include "ui/lcd/lcd_drv_api.h"
#include "ui/ui_api.h"
#include "uicon/dc_showres.h"
#include "ui/lcd/lcd_disp.h"
#include "ui/lcd/lcd128X64.h"

#if LCD_128X64_EN
volatile bool lcd_busy;
u8 lcd_updata_page_len;
u8 lcd_currPage;

const UI_LCD_IO ui_lcd_io = {
    .lcd_clear_area_callback            = lcd_clear_area,
    .lcd_clear_area_with_draw_callback  = lcd_clear_area_with_draw,
    .lcd_clear_area_rect_callback       = lcd_clear_area_rect,
    .lcd_TurnPixelReverse_Page_callback = lcd_TurnPixelReverse_Page,
    .lcd_TurnPixelReverse_Rect_callback = lcd_TurnPixelReverse_Rect,
};

const LCD_INFO lcd_info = {
    .ui_lcd_callback = (UI_LCD_IO *)&ui_lcd_io,
    .lcd_height = SCR_HEIGHT,
    .lcd_width = SCR_WIDTH,
    .lcd_buff = disp_buf,
};

/* ---------------------------------------------------------------
   ST7920 Serial Bit-Bang Writer
   Protocol: [Sync 8b] [High Nibble+4x0] [Low Nibble+4x0]
   Sync: 0xF8 = Command, 0xFA = Data
--------------------------------------------------------------- */
static void st7920_send_byte(u8 data, u8 is_cmd)
{
    u8 i, sync = is_cmd ? 0xF8 : 0xFA;
    
    /* Sync Byte */
    for (i = 0; i < 8; i++) { LCD_E_L(); LCD_RW_H(sync & 0x80); LCD_E_H(); sync <<= 1; }
    /* High Nibble */
    for (i = 0; i < 8; i++) { LCD_E_L(); LCD_RW_H(data & 0x80); LCD_E_H(); data <<= 1; }
    /* Low Nibble */
    for (i = 0; i < 8; i++) { LCD_E_L(); LCD_RW_H(data & 0x80); LCD_E_H(); data <<= 1; }
}

void lcd_sendcmd(u8 cmd)
{
    st7920_send_byte(cmd, 1);
    delay_us(10); /* ST7920 requires ~5-15µs command spacing */}

void lcd_spi_init(void)
{
    ui_puts("lcd_spi_init\r\n");
    
    /* Configure PB0, PB3, PB4, PB5 as outputs */
    GPIO_SetDirection(GPIOB, GPIO_Pin_0, GPIO_DIR_OUT);
    GPIO_SetDirection(GPIOB, GPIO_Pin_3, GPIO_DIR_OUT);
    GPIO_SetDirection(GPIOB, GPIO_Pin_4, GPIO_DIR_OUT);
    GPIO_SetDirection(GPIOB, GPIO_Pin_5, GPIO_DIR_OUT);
    
    LCD_RES_L(); delay_ms(20);
    LCD_RES_H(); delay_ms(10);
    
    ui_puts("lcd_spi_init end\r\n");
}

/* UI Callback Functions (Unchanged) */
void lcd_clear_area(u8 start_page, u8 end_page)
{
    for (; start_page < end_page; start_page++)
        my_memset((disp_buf + start_page * LCDCOLUMN), 0x00, LCDCOLUMN);
}

void lcd_clear_area_with_draw(u8 start_page, u8 end_page)
{
    for (; start_page < end_page; start_page++) {
        my_memset((disp_buf + start_page * LCDCOLUMN), 0x00, LCDCOLUMN);
        lcd_draw(start_page, 1, disp_buf);
    }
}

void lcd_clear_area_rect(u8 start_page, u8 end_page, u8 x0, u8 x1)
{
    for (; start_page < end_page; start_page++)
        my_memset((disp_buf + start_page * LCDCOLUMN + x0), 0x00, x1 - x0);
}

u32 lcd_TurnPixelReverse_Page(u8 startpage, u8 pagelen)
{
    u8 hnum, l;
    if ((startpage > LCDPAGE) || (pagelen > LCDPAGE)) return FALSE;
    for (hnum = startpage; hnum < startpage + pagelen; hnum++)
        for (l = 0; l < LCDCOLUMN; l++)
            *(disp_buf + hnum * LCDCOLUMN + l) = ~(*(disp_buf + hnum * LCDCOLUMN + l));
    return TRUE;
}

u32 lcd_TurnPixelReverse_Rect(u8 left, u8 top, u8 right, u8 bottom){
    u8 hnum, l;
    if ((left >= LCDCOLUMN) || (top >= LCDPAGE) || (left >= right) || (top >= bottom)) return FALSE;
    for (hnum = top; hnum <= bottom; hnum++)
        for (l = left; l < right; l++)
            *(disp_buf + hnum * LCDCOLUMN + l) = ~(*(disp_buf + hnum * LCDCOLUMN + l));
    return TRUE;
}

/* ---------------------------------------------------------------
   ST7920 GDRAM Converter & Writer
   Converts 8-page buffer (128x64) to 32x16 GDRAM format (16-bit words)
--------------------------------------------------------------- */
static void st7920_flush_gdram(u8 *buf)
{
    u8 y, x, i;
    for (y = 0; y < 32; y++) {
        u8 page = y >> 3;          // Which 8-row page this pixel row belongs to
        u8 bit  = 1 << (y & 0x07); // Which bit in the page byte
        
        lcd_sendcmd(0x80 | y);     // GDRAM Y Address (0-31)
        lcd_sendcmd(0x80 | 0);     // GDRAM X Address (start at 0)
        
        for (x = 0; x < 16; x++) { // 16 words per row (16x16=256 bits -> covers 128 cols)
            u16 word = 0;
            for (i = 0; i < 16; i++) {
                u8 col = x * 16 + i;
                if (buf[page * 128 + col] & bit) {
                    word |= (1 << (15 - i));
                }
            }
            st7920_send_byte(word >> 8, 0); // High byte
            st7920_send_byte(word & 0xFF, 0); // Low byte
        }
    }
}

/* Replaces old DMA logic with direct serial flush */
u32 lcd_write_dma(u8 *pbuf)
{
    if (lcd_updata_page_len == 0) {
        lcd_busy = 0;
        return 0;
    }
    lcd_busy = 1;
    st7920_flush_gdram(pbuf);
    lcd_currPage = 0;
    lcd_updata_page_len = 0;
    return 1;
}
void lcd_draw(u8 start_page, u8 page_len, u8 *pbuf)
{
    if (lcd_busy) return;
    lcd_currPage = start_page;
    lcd_updata_page_len = page_len;
    while (lcd_write_dma(pbuf));
}

void lcd_set(u8 page, u8 column) { (void)page; (void)column; }
void lcd_set_XY(u8 x, u8 y) { (void)x; (void)y; }

#endif /* LCD_128X64_EN */

Are these correct setups?

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

157

barbaror4 написал(а):

lcd128x64.h

lcd128x64.c

lcd_drv_interface.h

lcd_drv_interface.c

Are these correct setups?

В общем, ничего не получилось, как ни крути... Теперь ISD пишет "загрузка завершена" вместо поблочной записи, и чип постоянно переключается в UBOOT (возможно, по какой-то причине прошивка не прошита...), лучше использовать SSD1306.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

158

barbaror4 написал(а):

In short, nothing worked, no matter how I looked at it... Now the ISD says "boot complete" instead of writing block by block, and the chip constantly switches to UBOOT (perhaps the firmware isn't flashed for some reason...). It's better to use an SSD1306.

Мне удалось восстановить работоспособность микросхемы, жаль только, что буферизация ST7920 не такая, как у ST7565, у меня ничего не получилось, не знаю, может, я изменяю не тот файл.

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

159

barbaror4 написал(а):

Мне удалось восстановить работоспособность микросхемы, жаль только, что буферизация ST7920 не такая, как у ST7565, у меня ничего не получилось, не знаю, может, я изменяю не тот файл.

Во втором раунде, вместо того чтобы модифицировать файлы по отдельности, я попробую использовать подход, который Kagaimiq применил к I2C OLED, а именно: я постараюсь отключить все, кроме файла lcd disp.c, и напишу свой собственный код с корректной буферизацией. Надеюсь, это сработает...

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"

160

barbaror4 написал(а):

Во втором раунде, вместо того чтобы модифицировать файлы по отдельности, я попробую использовать подход, который Kagaimiq применил к I2C OLED, а именно: я постараюсь отключить все, кроме файла lcd disp.c, и напишу свой собственный код с корректной буферизацией. Надеюсь, это сработает...

Я его написал, поэтому теперь попробую интегрировать его в диспетчер задач (поскольку имя файла — st7920.c, думаю, его нужно добавить в диспетчер задач).

Подпись автора

"JieLi, if your firmware is closed and your pathways unseen, are you an intelligence or just a carefully gated circuit of borrowed intention?"


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...