• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

8710 странности с GPIO

sharikov

Active member
Решил я значит помигать светодиодом :)
Смотрю example_sources/gpio, там все просто как грабли. Пишу в точности как в примере собираю, заливаю... ноги не шевелятся, более того если смотреть отладчиком регистры gpio в них нули и не записывается даже если писать в регистр через gdb / openocd.
Код:
Код:
#include "device.h"
#include "diag.h"
#include "main.h"
#include "gpio_api.h"   // mbed

void main(void)
{
    gpio_t gpio_test;
    PinName pin = PC_5;
    int i;
   
    gpio_init(&gpio_test, pin);
    gpio_dir(&gpio_test, PIN_OUTPUT);    // Direction: Output
    gpio_mode(&gpio_test, PullNone);     // No pull

    while (1)
    {
        DiagPrintf("hal_pin.pin_name=%d : \t", gpio_test.hal_pin.pin_name);
        gpio_write(&gpio_test, 0);

        DiagPrintf("0\t");

        gpio_write(&gpio_test, 1);

        DiagPrintf("1\n");
    }
Судя по тому что в регистры не пишется даже отладчиком подумал что не включено тактирование gpio.
Добавил в начале программы
Код:
    ACTCK_GPIO_CCTRL(ON);
    SLPCK_GPIO_CCTRL(ON);
    HAL_PERI_ON_WRITE32(REG_GPIO_SHTDN_CTRL, 0x7FF);
    GPIO_FCTRL(ON);
Теперь в регистры портов начали записываться данные, но сигнала на ножке так и не появилось. Составил таблицу для всех выводов RL-00:
Код:
PORT | RESULT                                            | hal_pin.pin_name | PORT, Mask          | direct write to DR, DDR
PA_0 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(0) Unavailable  | name = 0         | PORTA_DR=0x00000001 | dbg-nok
PA_1 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(1) Unavailable  | name = 1         | PORTA_DR=0x00000002 | dbg-nok
PA_2 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(2) Unavailable  | name = 32        | PORTB_DR=0x00000001 | dbg-nok
PA_3 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(3) Unavailable  | name = 33        | PORTB_DR=0x00000002 | dbg-ok
PA_4 | nok (output = high)                               | name = 34        | PORTB_DR=0x00000004 | dbg-nok
PA_5 | ok                                                | name = 35        | PORTB_DR=0x00000008

PC_0 | ok                                                | name = 42        | PORTB_DR=0x00000400
PC_1 | ok                                                | name = 6         | PORTA_DR=0x00000040
PC_2 | ok                                                | name = 43        | PORTB_DR=0x00000800
PC_3 | ok                                                | name = 7         | PORTA_DR=0x00000080
PC_4 | ok                                                | name = 8         | PORTA_DR=0x00000100
PC_5 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(25) Unavailable | name = 9         | PORTA_DR=0x00000200 | dbg-ok


PE_1 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(41) Unavailable | name = 21        | PORTA_DR=0x00200000 | dbg-nok
PE_2 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(42) Unavailable | name = 22        | PORTA_DR=0x00400000 | dbg-nok
PE_3 | [GPIO Err]HAL_GPIO_Init: GPIO Pin(43) Unavailable | name = 23        | PORTA_DR=0x00800000 | dbg-nok
Имеется три класса результатов:
1) работает
2) не работает но если писать напрямую в регистры то работает. это потому что gpio_init выдает ложную ошибку и не настраивает DDR
3) никак не работает, даже если писать в DDR и DR. предположительно включен неправильный pin mux.

Выводы:
* gpio_init не настраивает pin mux в режим gpio
* HAL содержит ошибки и ругается на пины которые могли бы работать
* gpio api перетяжелено, распределение портов бредовое
* jtag похоже занимает весь порт E
* если нужен spi0 на порту C то работоспособных gpio почти не остается

Вопрос:
как настроить pin mux на режим gpio ?
 

pvvx

Активный участник сообщества
Смотрю example_sources/gpio, там все просто как грабли. Пишу в точности как в примере собираю, заливаю... ноги не шевелятся, более того если смотреть отладчиком регистры gpio в них нули и не записывается даже если писать в регистр через gdb / openocd.
Какой SDK и вообще что используется?
1488254026.gif
Код:
#include "rtl8195a.h"
#include "objects.h"

gpio_t gpio_obj;

void main(void)
{
#if 1
    ConfigDebugErr  = -1;
    ConfigDebugInfo = ~_DBG_SPI_FLASH_;
    ConfigDebugWarn = -1;
    CfgSysDebugErr = -1;
    CfgSysDebugInfo = -1;
    CfgSysDebugWarn = -1;
#endif
     gpio_init(&gpio_obj, PC_5);
     gpio_dir(&gpio_obj, PIN_OUTPUT);
     gpio_set(&gpio_obj);
     while(1) {
        gpio_write(&gpio_obj, 1);
        gpio_write(&gpio_obj, 0);
     }
}
Вывод - не пользуйтесь кривыми SDK :) В моем всё работает. В SDK от PADI половина HAL не работает - закрыто для RTL8710 :p Про это неоднократно предупреждалось.
Хотя-бы открыли любой пример из SDK - там дано всё как инициализировать и как работать с пинами.
На Arduino тоже все I/O работают.
 
Последнее редактирование:

sharikov

Active member
Какой SDK и вообще что используется?
sdk-ameba-rtl8710af-v3.5a_without_NDA_GCC_V1.0.0
- не пользуйтесь кривыми SDK :) В моем всё работает. В SDK от PADI половина HAL не работает - закрыто для RTL8710
Пользуюсь публично доступным SDK, других то нет.
Хотя-бы открыли любой пример из SDK - там дано всё как инициализировать и как работать с пинами.
Взял пример из sdk-ameba-rtl8710af-v3.5a_without_NDA_GCC_V1.0.0/project/realtek_ameba1_va0_example/example_sources/gpio
На Arduino тоже все I/O работают.
Ардуину еще не проверял но содержимое pin descriptions файла Arduino/variant.cpp at master · Ameba8195/Arduino · GitHub не внушает оптимизма.
 

pvvx

Активный участник сообщества
sdk-ameba-rtl8710af-v3.5a_without_NDA_GCC_V1.0.0

Пользуюсь публично доступным SDK, других то нет.
Оф. только 3.4. выпущенный в прошлом году :) В Arduino уже какая-то версия 3.5. А этот от PADI.
Он кроме закрывания большей части HAL устанавливает 83MHz при старте с Flash. При загрузке из RAM - 166MHz. Странный он.
Меняйте файлы
RTL00MP3/hal_efuse.c at master · pvvx/RTL00MP3 · GitHub
RTL00MP3/hal_pinmux.c at master · pvvx/RTL00MP3 · GitHub
вставьте в трансляцию (и линковку), а их obj из lib_platform.a удалите - HAL заработает.
Взял пример из sdk-ameba-rtl8710af-v3.5a_without_NDA_GCC_V1.0.0/project/realtek_ameba1_va0_example/example_sources/gpio
Он работает. Но надо учитывать, какие пины есть у модуля. Внутренности у чипа то одинаковы с RTL8195. Отсутствует USB и SDRAM, да Flash на 1 МБ.
Ардуину еще не проверял но содержимое pin descriptions файла Arduino/variant.cpp at master · Ameba8195/Arduino · GitHub не внушает оптимизма.
А оно используется? :) Это что-то для какого-то инита. Там многое ещё не дописано для RTL8710.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Код:
/*
* Demonstrates use 21 i/o RTL00
**/
extern "C" void HalPinCtrlRtl8195A(int,int,int);

void setup() {
    printf("\nTest 21 i/o...\n");
    HalPinCtrlRtl8195A(216,0,0); // JTAG Off
    HalPinCtrlRtl8195A(220,0,0); // LOG_UART Off
    for(int i = 0; i < TOTAL_GPIO_PIN_NUM; i++) pinMode(i, OUTPUT);
}

void loop() {
    for(int i = 0; i < TOTAL_GPIO_PIN_NUM; i++) {
      digitalWrite(i, HIGH);
      digitalWrite(i, LOW);
    }
}
Все пины работают... проверил осцил-ом.
Код:
===== Enter Image 2 ====
Test 21 i/o..ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ.....
Патч variant.h/cpp для RTL00:
#define TOTAL_GPIO_PIN_NUM (21)
#define LED_BUILTIN 4
#define SS 10
...
Код:
/*
* Pins descriptions
*/
PinDescription g_APinDescription[TOTAL_GPIO_PIN_NUM]=
{
  {PA_0, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ          , NOT_INITIAL}, //D0  : CD_D2, UART2_RX, SPI_MISO, GPIO_INT
  {PA_1, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ          , NOT_INITIAL}, //D1  : CD_D3, UART2_CTS, SPI1_MOSI, GPIO_INT
  {PA_2, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D2  : CD_CMD, UART2_RTS, SPI1_CLK
  {PA_3, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D3  : CD_CLK
  {PA_4, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D4  : CD_D0, UART2_TX, SPI1_CS, LED1
  {PA_5, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D5  : CD_D1, D_SBY0
  {PB_0, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D6  : CON_TX, ETE0, LED0
  {PB_1, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D7  : CON_RX, WL_LED0, ETE1, D_SLP0
  {PB_2, NOT_INITIAL, PIO_GPIO                         , NOT_INITIAL}, //D8  : I2C3_SCL, ETE2
  {PB_3, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ          , NOT_INITIAL}, //D9  : I2C3_SDA, ETE3, GPIO_INT
  {PC_0, NOT_INITIAL, PIO_GPIO                | PIO_PWM, NOT_INITIAL}, //D10 : PWM0, SPI0_CS0, UART0_RX, I2S1_WS, PCM1_SYNC, ETE0
  {PC_1, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL}, //D11 : PWM1, SPI0_CLK, UART0_CTS, I2S1_CLK, PCM1_CLK, ETE1, GPIO_INT
  {PC_2, NOT_INITIAL, PIO_GPIO                | PIO_PWM, NOT_INITIAL}, //D12 : PWM2, SPI0_MOSI, UART0_RTS, I2S1_SD_TX, PCM1_OUT, ETE2
  {PC_3, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL}, //D13 : PWM3, SPI0_MISO, UART0_TX, I2S1_MCK, PCM1_IN, ETE3, GPIO_INT
  {PC_4, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ          , NOT_INITIAL}, //D14 : I2C1_SDA, SPI0_CS1, I2S1_SD_RX, GPIO_INT
  {PC_5, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ          , NOT_INITIAL}, //D15 : I2C1_SCL, SPI0_CS2, GPIO_INT
  {PE_0, NOT_INITIAL, PIO_GPIO                | PIO_PWM, NOT_INITIAL}, //D16 : PWM0, JTAG_TRST, UART0_TX, I2C2_SCL, SPI0_CS0, PCM0_SYNC
  {PE_1, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL}, //D17 : PWM1, JTAG_TDI, UART0_RTS, SPI0_CLK, GPIO_INT
  {PE_2, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL}, //D18 : PWM2, JTAG_TDO, UART0_CTS, SPI0_MOSI, GPIO_INT
  {PE_3, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL}, //D19 : PWM3, JTAG_TMS, UART0_RX, SPI0_MISO, GPIO_INT, D_SBY3
  {PE_4, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ          , NOT_INITIAL}, //D20 : JTAG_CLK, SPI0_CS1
};
По идее должны работать и по DMA...
 
Последнее редактирование:

kissste

Member
Bit banding (feature of Cortex M3) works well, as expected.

@166.66MHz CPU

gpio_write 1, and then gpio_write 0 takes ~0.57us
gpio_write(&gpio_ledC3, 1);
gpio_write(&gpio_ledC3, 0);

Bit-Banding =1, and then Bit-Banding = 0 takes ~0.17 us
GPIO_C3 = 1;
GPIO_C3 = 0;

#define BITBAND_PERI_REF 0x40000000
#define BITBAND_PERI_BASE 0x42000000
#define BITBAND_PERI(a,b) ((BITBAND_PERI_BASE + (a-BITBAND_PERI_REF)*32 + (b*4))) // Convert PERI address

#define P0_ADDR 0x40001000
#define GPIO_A0 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE,0))) //Port = 0, bit = 0, A0
#define GPIO_A1 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE,1))) //Port = 0, bit = 1, A1
#define GPIO_A2 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE+12,0))) //Port = 1, bit = 0, A2
#define GPIO_A3 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE+12,1))) //Port = 1, bit = 1, A3
#define GPIO_A4 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE+12,2))) //Port = 1, bit = 2, A4
#define GPIO_A5 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE+12,3))) //Port = 1, bit = 3, A5

#define GPIO_C0 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE+12,10))) //Port = 1, bit = 10, C0
#define GPIO_C1 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE,6))) //Port = 0, bit = 6, C1
#define GPIO_C2 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE+12,11))) //Port = 1, bit = 11, C2
#define GPIO_C3 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE,7))) //Port = 0, bit = 7, C3
#define GPIO_C4 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE,8))) //Port = 0, bit = 8, C4
#define GPIO_C5 *((volatile unsigned char *)(BITBAND_PERI(GPIO_REG_BASE,9))) //Port = 0, bit = 9, C5

other port addresses:
PA_0 pin_name: 0, port_num: 0, pin_num: 0, addr_shiftDDR: 4, DR:0, chip_pin: 0
PA_1 pin_name: 1, port_num: 0, pin_num: 1, addr_shiftDDR: 4, DR:0, chip_pin: 1
PA_2 pin_name: 32, port_num: 1, pin_num: 0, addr_shiftDDR: 16, DR:12, chip_pin: 2
PA_3 pin_name: 33, port_num: 1, pin_num: 1, addr_shiftDDR: 16, DR:12, chip_pin: 3
PA_4 pin_name: 34, port_num: 1, pin_num: 2, addr_shiftDDR: 16, DR:12, chip_pin: 4
PA_5 pin_name: 35, port_num: 1, pin_num: 3, addr_shiftDDR: 16, DR:12, chip_pin: 5
PB_0 pin_name: 38, port_num: 1, pin_num: 6, addr_shiftDDR: 16, DR:12, chip_pin: 16
PB_1 pin_name: 39, port_num: 1, pin_num: 7, addr_shiftDDR: 16, DR:12, chip_pin: 17
PB_2 pin_name: 40, port_num: 1, pin_num: 8, addr_shiftDDR: 16, DR:12, chip_pin: 18
PB_3 pin_name: 2, port_num: 0, pin_num: 2, addr_shiftDDR: 4, DR:0, chip_pin: 19
PB_4 pin_name: 3, port_num: 0, pin_num: 3, addr_shiftDDR: 4, DR:0, chip_pin: 20
PB_5 pin_name: 41, port_num: 1, pin_num: 9, addr_shiftDDR: 16, DR:12, chip_pin: 21
PC_0 pin_name: 42, port_num: 1, pin_num: 10, addr_shiftDDR: 16, DR:12, chip_pin: 32
PC_1 pin_name: 6, port_num: 0, pin_num: 6, addr_shiftDDR: 4, DR:0, chip_pin: 33
PC_2 pin_name: 43, port_num: 1, pin_num: 11, addr_shiftDDR: 16, DR:12, chip_pin: 34
PC_3 pin_name: 7, port_num: 0, pin_num: 7, addr_shiftDDR: 4, DR:0, chip_pin: 35
PC_4 pin_name: 8, port_num: 0, pin_num: 8, addr_shiftDDR: 4, DR:0, chip_pin: 36
PC_5 pin_name: 9, port_num: 0, pin_num: 9, addr_shiftDDR: 4, DR:0, chip_pin: 37
PE_0 pin_name: 47, port_num: 1, pin_num: 15, addr_shiftDDR: 16, DR:12, chip_pin: 64
PE_1 pin_name: 21, port_num: 0, pin_num: 21, addr_shiftDDR: 4, DR:0, chip_pin: 65
PE_2 pin_name: 22, port_num: 0, pin_num: 22, addr_shiftDDR: 4, DR:0, chip_pin: 66
PE_3 pin_name: 23, port_num: 0, pin_num: 23, addr_shiftDDR: 4, DR:0, chip_pin: 67
PE_4 pin_name: 48, port_num: 1, pin_num: 16, addr_shiftDDR: 16, DR:12, chip_pin: 68
PE_5 pin_name: 24, port_num: 0, pin_num: 24, addr_shiftDDR: 4, DR:0, chip_pin: 69
 

sharikov

Active member
Меняйте файлы
RTL00MP3/hal_efuse.c at master · pvvx/RTL00MP3 · GitHub
RTL00MP3/hal_pinmux.c at master · pvvx/RTL00MP3 · GitHub
вставьте в трансляцию (и линковку), а их obj из lib_platform.a удалите - HAL заработает.
Поменял, удалил.
Заработали порты PC_5, PA_3, почти исчезли сообщения [GPIO Err]HAL_GPIO_Init:...
Остальные не ругаются но и не работают, PE не устанавливает DDR но меняет DR.

Проверил в arduino - не работают:
PA весь за исключением PA_5;
PC_5.

PE работает но отключение всего JTAG неприемлемо. SWD нужно оставить для отладки.
 
Последнее редактирование:

pvvx

Активный участник сообщества
PE работает но отключение всего JTAG неприемлемо. SWD нужно оставить для отладки.
Jtag работает после reset.
Вам мало 21 вывода i/o :)
Обновление ПО делается по OTA. Скоро может напишу замену загрузчика - будет писать по UART. Пока не знаю какой интерфейс записи в Flash по UART взять - от дурины?
 
Последнее редактирование:

sharikov

Active member
Jtag работает после reset.
Вам мало 21 вывода i/o :)
Обновление ПО делается по OTA. Скоро может напишу замену загрузчика - будет писать по UART. Пока не знаю какой интерфейс записи в Flash по UART взять - от дурины?
По OTA делается обновление прошивки коммерческого изделия до чего пока как до луны.
Для отладки пинов не хватает но не потому что их мало а потому что непонятна ситуация с pin mux. Отладка убивает весь порт E тогда как для swd надо всего 2 вывода. Log uart забирает 2 вывода тогда как для вывода диагностики достаточно только TX а RX можно использовать как gpio. Аппаратный SPI_CS бесполезен если используется программный выбор слэйва.

Port A у меня заработал после добавления перед инициализацией
Код:
    HalPinCtrlRtl8195A(UART0,0,0);
    HalPinCtrlRtl8195A(UART1,0,0);
    HalPinCtrlRtl8195A(UART2,0,0);
    HalPinCtrlRtl8195A(SPI0,0,0);
    HalPinCtrlRtl8195A(SPI1,0,0);
    HalPinCtrlRtl8195A(SPI2,0,0);
    //HalPinCtrlRtl8195A(SPI0_MCS,0,0);  // зависает
    HalPinCtrlRtl8195A(I2C0,0,0);
    HalPinCtrlRtl8195A(I2C1,0,0);
    HalPinCtrlRtl8195A(I2C2,0,0);
    HalPinCtrlRtl8195A(I2C3,0,0);
    HalPinCtrlRtl8195A(I2S0,0,0);
    HalPinCtrlRtl8195A(I2S1,0,0);
    HalPinCtrlRtl8195A(PCM0,0,0);
    HalPinCtrlRtl8195A(PCM1,0,0);
pin mux при старте инициализируются неправильно а gpio_init mux вообще не трогает - вот поэтому gpio работает не всегда.
 

pvvx

Активный участник сообщества
По OTA делается обновление прошивки коммерческого изделия до чего пока как до луны.
Для отладки пинов не хватает но не потому что их мало а потому что непонятна ситуация с pin mux. Отладка убивает весь порт E тогда как для swd надо всего 2 вывода. Log uart забирает 2 вывода тогда как для вывода диагностики достаточно только TX а RX можно использовать как gpio. Аппаратный SPI_CS бесполезен если используется программный выбор слэйва.
Впишите всё что нравится в инициализацию... В чем проблемы? Может вам надо это GitHub - pvvx/RtlDuino: Arduino module RTL00(RTL8710AF), F11AMIM13 (RTL8711AM) (шутка :) ), со временем соберу... Но там уже толпа рабочих examples... с RTL8711AM ещё не всё ладно и там счас кривая версия.
У меня работают порты на обоих типах модулей (с RTL8710AF и RTL8711AM).
Я в SDK что-то ещё менял, сейчас уже не помню, т.к. поправок требуется много в SDK3.5a для модуля RTL00, иначе там мало памяти и т.д. Рабочие исходники есть в RTL00MP3/RTL00_SDKV35a at master · pvvx/RTL00MP3 · GitHub. Я их периодически обновляю...

И сдался вам весь порт E - он имеет отдельное питание, которое на модуле RTL00 включено в кучу...
Прикрутите нормальный JTAG/SWD с RESET и всё будет работать.

"Аппаратный SPI_CS" очень полезен. Без него ужас... Согласовывать CS руками с DMA?

"Port A у меня заработал после добавления перед инициализацией" - работает без всякой пред-инициализации и в Arduino и в моем SDK... Не знаю что там у вас с ним.

"HalPinCtrlRtl8195A(SPI0_MCS,0,0);" - не зависает. Нет там ничего на SPI0:
Код:
void main(void)
{
#if 1
    ConfigDebugErr  = -1;
    ConfigDebugInfo = ~_DBG_SPI_FLASH_;
    ConfigDebugWarn = -1;
    CfgSysDebugErr = -1;
    CfgSysDebugInfo = -1;
    CfgSysDebugWarn = -1;
#endif
    HalPinCtrlRtl8195A(SPI0_MCS,0,0);
    DiagPrintf("\nHalPinCtrlRtl8195A(SPI0_MCS,0,0) ok?\n");
     gpio_init(&gpio_obj, PC_5);
     gpio_dir(&gpio_obj, PIN_OUTPUT);
     while(1) {
        gpio_write(&gpio_obj, 1);
        gpio_write(&gpio_obj, 0);
     }
}
Код:
===== Enter Image 2 ====

HalPinCtrlRtl8195A(SPI0_MCS,0,0) ok?
[GPIO Inf]HAL_GPIO_Init_8195a: GPIO(name=0x9)(mode=0)
[GPIO Inf]GPIO_FuncOn_8195a!!
[GPIO Inf]HAL_GPIO_Init_8195a: GPIO(name=0x9)(mode=3)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Посмотрите, что у вас записано в CalibrationData (flash: 0x9000..0x1000)... Оно может влиять, как и прописанные беспорядочно efuse в чипе...
 

sharikov

Active member
"Аппаратный SPI_CS" очень полезен. Без него ужас... Согласовывать CS руками с DMA?
Задачи у всех разные. Чтобы читать по 6 байт из трех ацп dma без надобности а несколько CS критически необходимы. Всего у меня 4 слэйва на spi . Использую 2 gpio и дешифратор. Еще нужно 2 gpio на ввод и 1 на вывод.

"Port A у меня заработал после добавления перед инициализацией" - работает без всякой пред-инициализации и в Arduino и в моем SDK... Не знаю что там у вас с ним.
Оно не работает ни в sdk ни в arduino иначе бы я не открыл тему.
Предположение:
у меня сохранена штатная AT прошивка модуля rtl-00. Возможно она настраивает pinmux в какой-то режим и потом после заливки моей программы в RAM настройки pinmux не инициализируются.
 

pvvx

Активный участник сообщества
Задачи у всех разные. Чтобы читать по 6 байт из трех ацп dma без надобности а несколько CS критически необходимы. Всего у меня 4 слэйва на spi . Использую 2 gpio и дешифратор. Еще нужно 2 gpio на ввод и 1 на вывод.
CS-ы переключаются.
Оно не работает ни в sdk ни в arduino иначе бы я не открыл тему.
Предположение:
у меня сохранена штатная AT прошивка модуля rtl-00. Возможно она настраивает pinmux в какой-то режим и потом после заливки моей программы в RAM настройки pinmux не инициализируются.
Дайте точный пример для теста. Интересно (в самом начале у меня не включался PA_5 или PA_3, счас не помню, но когда выкинул налепленный код для RTL8710 в SDK3.5a, то всё заработало... может не всё выкинул (?)...). В SDK от PADI 3.5a точно не работает PC_5 и другие RTL00MP3/hal_pinmux.c at master · pvvx/RTL00MP3 · GitHub
 
Последнее редактирование:

pvvx

Активный участник сообщества
Есть общая таблица GPIOState в начале RAM, которая назначается ещё в ROM-BIOS. В ней указаны текущие состояния портов и включенной периферии.

У меня в Arduino:
Код:
extern uint16_t GPIOState[];
void setup() {
  for (int i = 0; i <= 10; i++) printf("Port %c state: 0x%04x\n", i+'A', GPIOState[i]);
}
void loop() {  delay(100); }
Код:
===== Enter Image 2 ====
Port A state: 0x0000
Port B state: 0x0000
Port C state: 0x0000
Port D state: 0x0000
Port E state: 0x001f
Port F state: 0x003f
Port G state: 0x0000
Port H state: 0x0000
Port I state: 0x0000
Port J state: 0x0000
Port K state: 0x0000
По ней видно, что задействованы только PE_0..4 на JTAG.
Про LOG_UART там почему-то не отмечено. Но если дать команду [inline]HalPinCtrlRtl8195A(LOG_UART,0,1)[/inline], то:
Port A state: 0x0000
Port B state: 0x0003
Port C state: 0x0000
Port D state: 0x0000
Port E state: 0x001f
Port F state: 0x003f
Port G state: 0x0000
Port H state: 0x0000
Port I state: 0x0000
Port J state: 0x0000
Port K state: 0x0000
После этого [inline]pinMode(6, OUTPUT)[/inline] [inline]pinMode(7, OUTPUT)[/inline] не включатся:
[GPIO Err]HAL_GPIO_Init: GPIO Pin(10) Unavailable
[GPIO Err]HAL_GPIO_Init: GPIO Pin(11) Unavailable
 
Последнее редактирование:

sharikov

Active member
У меня в Arduino:
Код:
===== Enter Image 2 ====
Port A state: 0x0000
Port B state: 0x0000
Port C state: 0x0000
Port D state: 0x0000
Port E state: 0x001f
Port F state: 0x003f
Port G state: 0x0000
Port H state: 0x0000
Port I state: 0x0000
Port J state: 0x0000
Port K state: 0x0000
По ней видно, что задействованы только PE_0..4 на JTAG.
У меня в sdk так же.
Код:
Img2 Sign: RTKWin, InfaStart @ 0x10006069                                     
===== Enter Image 2 ====                                                      
GPIOState:                                                                    
[0]=0x0                                                                       
[1]=0x0                                                                       
[2]=0x0                                                                       
[3]=0x0                                                                       
[4]=0x1f                                                                      
[5]=0x3f                                                                      
[6]=0x0                                                                       
[7]=0x0                                                                       
[8]=0x0                                                                       
[9]=0x0                                                                       
[10]=0x0
Обратите внимание на [4]=0x1f (у вас port E). 1f - включен spi1 на PA_*. После HalPinCtrlRtl8195A(SPI1,0,0); [4] меняется на =0x10 и после этого PA начинают работать.
Т.е с дефолтным состоянием GPIOState PA работать не может никак потому что занят spi1.
 

pvvx

Активный участник сообщества
"[4]=0x1f " - это JTAG
В таблице не помечен PB_0 и PB_1. Они включены на Uart Console. Видать Ошибка - инициализация стоит до создания данной таблицы и регистры уже переключены на UART console. Т.е. реально они не устанавливаются в режим i/o портов, пока не выполнить отключение console.
 

pvvx

Активный участник сообщества
На чипе RTL871xAF выведен и PF_5. В итоге имеется 22 I/O пина для пользования "ногодрыгом".
 

Seeker

New member
Разбирался с IP пинами, и получилась таблица
IP получал: HAL_GPIO_GetIPPinName_8195a(PA_0) - исходный код закрыт
Port и Pin: HAL_GPIO_GET_PORT_BY_NAME(), HAL_GPIO_GET_PIN_BY_NAME() - простое смещение
Снимок.PNG
Сложил с распиновкой чипа, однако ничего интересного не вышло
 

Вложения

Сверху Снизу