| Другое > Hard'n'Soft |
| Грязный железный хак [прототип] слабонервным - не нервничать |
| << < (5/6) > >> |
| s_s:
STB прижал линию, все SPI занят, нельзя туда грузить. Вот картинку нарисовал и того у меня 5мкс на загрузку нового байта, к примеру на ATmega168 при 16МГц (первоначальный вариант был собран) уходит ~1мкс. Код // SPI interrupt service routine ISR (SPI_STC_vect) { SPDR=last_read_controller_bytes; //отправка i-ого байта в слэйв turbo++; turbo %=4; }если убрать две последние строки можно еще быстрее загрузить. Пока SPI передает байт (примерно 0,2мс), я опрашиваю кнопки (на ATmega168 при 16МГц уходит на один опрос всех кнопок 4мкс). |
| HardWareMan:
--- Цитата: s_s от 30 Ноябрь 2019, 17:51:38 ---STB прижал линию, все SPI занят, нельзя туда грузить. --- Конец цитаты --- Кто сказал? Тебе надо успеть загрузить данные в SPI регистр до фактического чтения процессором, всего делов. Если ты подключил STB как nSS SPI, то тогда действительно нельзя, но это не наш метод. Я не знаю как там у этой богомерзкой ESP, но у православных STшек этот вход nSS можно настроить на управление программно. Т.е., пришло прерывание по фронту STB, мы загружаем регистр данных SPI и активируем nSS. А на прерывании TC (Transmission Complete) или RX мы просто деактивируем nSS. И да, главное в железо прогрузить, подтвердить прерывание можно после (обычно его делают в начале). Видимо плохо ты читаешь буквари на чипсы. Или вообще не читаешь. PS Такого функционала у AVR нет и там это проблема, хоть и решаемая. |
| s_s:
--- Цитата: HardWareMan от 30 Ноябрь 2019, 18:55:10 ---Т.е., пришло прерывание по фронту STB, мы загружаем регистр данных SPI и активируем nSS. --- Конец цитаты --- Лишняя команда --- Цитата ---активируем nSS --- Конец цитаты --- Что мой вариант = что ваш вариант + лишняя команда = одно и тоже. |
| HardWareMan:
--- Цитата: s_s от 30 Ноябрь 2019, 19:24:42 ---Лишняя команда --- Конец цитаты --- = не нужно соблюдать рамки длительности STB. |
| s_s:
И где я соблюдаю рамки длительности STB? --- Код: ---void SPI1_IRQHandler(void) { // прерывание по окончанию передачи байта SPI_SendData8(SPI1,last_read_controller_bytes); // в прерывании загрузка байта в регистр SPI } --- Конец кода --- |
| HardWareMan:
s_s, я должен тебе твой же код разъяснять? Однако. Почитай хоть историю общения для приличия. Хотя не надо, это будет уже оффтопом. |
| s_s:
--- Цитата: HardWareMan от 01 Декабрь 2019, 07:27:14 ---s_s, я должен тебе твой же код разъяснять? --- Конец цитаты --- но не у всех же у нас есть --- Цитата: HardWareMan ---подобный скилл --- Конец цитаты --- Если вам не составит большого труда пожалуйста разъясните мне? |
| xpk2k:
--- Цитата: s_s от 01 Декабрь 2019, 16:03:46 ---... пожалуйста разъясните мне? --- Конец цитаты --- Разъясняю Вторая попытка заюзать SPI driver выпучила тот факт, что я напрочь не понял, как он работает. Либо я путаю провода, либо одно из двух. Ссуть всей истории в том, что пин данных будто бы внезапно почему-то постоянно под напряжением. --- Цитата: s_s от 27 Ноябрь 2019, 18:38:06 ---А что так? Что делали, что изменяли? --- Конец цитаты --- Выяснять было совсем непонятно как, но это пришлось выяснять! Значит приставка на мой колхоз смотрела с высока и признаков сотрудничества проявлять не спешила. Наколхозил у запотных империализдов другой прототип, который какбы опрашивать способен джойстик. Приколхозил джойстик. Джойстик жмак - другой прототип - пик. Вывод: наличествует сотрудничество. Колхоз№1 + другой колхоз = постоянный писк будтобы я сумел нажать все кнопки сразу. И безусловно это очевидное достижение в вопросе сотрудничества. Вывод: напряжение пина данных вышло из под контроля. Почему? Вывод: ХЗ. Ваши разъяснения в студию! |
| s_s:
Так трудно гадать. Вы весь проект со всеми файлами в архив и сюда. У вас отладчик доступен? |
| xpk2k:
--- Цитата: s_s от 03 Декабрь 2019, 20:11:10 ---Так трудно гадать. Вы весь проект со всеми файлами в архив и сюда. У вас отладчик доступен? --- Конец цитаты --- Смысла весь код с файлами выкладывать нет. Подправил слегка этот пример spi_slave для для того, чтобы ESP32 начала вести себя как джойстик, и по очереди строку символов по байту заправить в SPI3 код spi_slave: /* SPI Slave example, receiver (uses SPI Slave driver to communicate with sender) This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include <stdio.h> #include <stdint.h> #include <stddef.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "freertos/queue.h" #include "lwip/sockets.h" #include "lwip/dns.h" #include "lwip/netdb.h" #include "lwip/igmp.h" #include "esp_wifi.h" #include "esp_system.h" #include "esp_event.h" #include "esp_event_loop.h" #include "nvs_flash.h" #include "soc/rtc_periph.h" #include "esp32/rom/cache.h" #include "driver/spi_slave.h" #include "esp_log.h" #include "esp_spi_flash.h" #include "driver/gpio.h" /* SPI receiver (slave) example. This example is supposed to work together with the SPI sender. It uses the standard SPI pins (MISO, MOSI, SCLK, CS) to transmit data over in a full-duplex fashion, that is, while the master puts data on the MOSI pin, the slave puts its own data on the MISO pin. This example uses one extra pin: GPIO_HANDSHAKE is used as a handshake pin. After a transmission has been set up and we're ready to send/receive data, this code uses a callback to set the handshake pin high. The sender will detect this and start sending a transaction. As soon as the transaction is done, the line gets set low again. */ /* Pins in use. The SPI Master can use the GPIO mux, so feel free to change these if needed. */ #define GPIO_HANDSHAKE 0 #define GPIO_MOSI 23 #define GPIO_MISO 19 #define GPIO_SCLK 18 #define GPIO_CS 5 //Called after a transaction is queued and ready for pickup by master. We use this to set the handshake line high. void my_post_setup_cb(spi_slave_transaction_t *trans) { // WRITE_PERI_REG(GPIO_OUT_W1TS_REG, (1<<GPIO_HANDSHAKE)); } //Called after transaction is sent/received. We use this to set the handshake line low. void my_post_trans_cb(spi_slave_transaction_t *trans) { // WRITE_PERI_REG(GPIO_OUT_W1TC_REG, (1<<GPIO_HANDSHAKE)); } //Main application void app_main() { int n=0; esp_err_t ret; //Configuration for the SPI bus spi_bus_config_t buscfg={ .mosi_io_num=GPIO_MOSI, .miso_io_num=GPIO_MISO, .sclk_io_num=GPIO_SCLK }; //Configuration for the SPI slave interface spi_slave_interface_config_t slvcfg={ .mode=0, .spics_io_num=GPIO_CS, .queue_size=3, .flags=0, .post_setup_cb=my_post_setup_cb, .post_trans_cb=my_post_trans_cb }; //Configuration for the handshake line gpio_config_t io_conf={ .intr_type=GPIO_INTR_DISABLE, .mode=GPIO_MODE_OUTPUT, .pin_bit_mask=(1<<GPIO_HANDSHAKE) }; //Configure handshake line as output // gpio_config(&io_conf); //Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected. gpio_set_pull_mode(GPIO_MOSI, GPIO_PULLUP_ONLY); gpio_set_pull_mode(GPIO_SCLK, GPIO_PULLUP_ONLY); gpio_set_pull_mode(GPIO_CS, GPIO_PULLUP_ONLY); //Initialize SPI slave interface ret=spi_slave_initialize(VSPI_HOST, &buscfg, &slvcfg, 2); assert(ret==ESP_OK); WORD_ALIGNED_ATTR char sendbuf[129]=""; WORD_ALIGNED_ATTR char recvbuf[129]=""; memset(recvbuf, 0, 33); spi_slave_transaction_t t; memset(&t, 0, sizeof(t)); while(1) { //Clear receive buffer, set send buffer to something sane memset(recvbuf+1, 0xA5, 129); sprintf(sendbuf, "This is the receiver, sending data for transmission number %04d.", n); //Set up a transaction of 128 bytes to send/receive t.length=8; t.tx_buffer=sendbuf+n; t.rx_buffer=NULL; //recvbuf; /* This call enables the SPI slave interface to send/receive to the sendbuf and recvbuf. The transaction is initialized by the SPI master, however, so it will not actually happen until the master starts a hardware transaction by pulling CS low and pulsing the clock etc. In this specific example, we use the handshake line, pulled up by the .post_setup_cb callback that is called as soon as a transaction is ready, to let the master know it is free to transfer data. */ ret=spi_slave_transmit(VSPI_HOST, &t, portMAX_DELAY); //spi_slave_transmit does not return until the master has done a transmission, so by here we have sent our data and //received data from the master. Print it. printf("iteration %d Received: %s\n", n, recvbuf); printf("Sent [%d]bits: 0b%1d%1d%1d%1d%1d%1d%1d%1d\n", t.trans_len, !!(sendbuf[n]&0b10000000), !!(sendbuf[n]&0b01000000), !!(sendbuf[n]&0b00100000), !!(sendbuf[n]&0b00010000), !!(sendbuf[n]&0b00001000), !!(sendbuf[n]&0b00000100), !!(sendbuf[n]&0b00000010), sendbuf[n]&0b00000001); if (n++ >128) n=0; } } код spi_host (подправленный проект ArduinoGameController): #include "GameControllers.h" //shared pins between all controllers const int LATCH_PIN = 16; //connected to spi_slave GPIO_CS 5 const int CLOCK_PIN = 17; //connected to spi_slave GPIO_SCLK 18 //individual data pin for each controller const int DATA_PIN_0 = 18; //connected to spi_slave GPIO_MISO 19 GameControllers controllers; void setup() { Serial.begin(115200); //prepare serial for text output Serial.println("NES init."); //initialize shared pins controllers.init(LATCH_PIN, CLOCK_PIN); //activate first controller ans set the type to SNES Serial.println("Set controller NES."); controllers.setController(0, GameControllers::NES, DATA_PIN_0); } void loop() { controllers.poll(); //read all controllers at once if(controllers.pressed(0, GameControllers::START)) //check if Start was pressed since last loop Serial.println("Start was pressed."); if(controllers.down(0, GameControllers::A)) //if A button is hold down repeat after 20 loops Serial.print("A"); if(controllers.down(0, GameControllers::B)) //check if B button it's currently pressed down Serial.print("B"); if(controllers.down(0, GameControllers::SELECT)) //check if B button it's currently pressed down Serial.print("Select"); if(controllers.down(0, GameControllers::START)) //check if B button it's currently pressed down Serial.print("Start"); if(controllers.down(0, GameControllers::UP)) //check if B button it's currently pressed down Serial.print("Up"); if(controllers.down(0, GameControllers::DOWN)) //check if B button it's currently pressed down Serial.print("Down"); if(controllers.down(0, GameControllers::LEFT)) //check if B button it's currently pressed down Serial.print("Left"); if(controllers.down(0, GameControllers::RIGHT)) //check if B button it's currently pressed down Serial.print("Right"); delay(50); //read controller just ~20times a second } |
| s_s:
--- Код: ---ret=spi_slave_transmit(VSPI_HOST, &t, portMAX_DELAY); --- Конец кода --- нельзя в цикле так делать, либо вы должны ждать пока мастер не заберет байт. &t вы структуру пихаете, а там по байтно нет? И не изобретайте --- Код: ---t.length=8; это вроде длина буфера, попробуйте так же и t.length=1 может это 1-байт t.tx_buffer=sendbuf; перед структурой добавьте sendbuf[0]=0xF7; в зависимости от порядка байт либо вверх либо старт t.rx_buffer=NULL; //recvbuf; --- Конец кода --- и добавьте после ret=spi_slave_transmit, в качестве эксперимента, задержку секунд так 2-5, хватит что бы мастер забрал. Я бы покопал функцию spi_slave_transmit(), я по этому и пишу что весь архив нужен. Вы через такой конвертер уровней подключаете |
| xpk2k:
--- Цитата: xpk2k от 27 Ноябрь 2019, 07:58:46 --- unijoysticle2.nes.src.zip (7.89 КБ - загружено 6 раз.) --- Конец цитаты --- Признайтесь, товарищи, кто из вас смог/пытался скомпилировать? С какой целью скачивал? |
| xpk2k:
удалось добиться стабильной работы esp32 как джойстика на симуляторе считываний джойстика при уровне сигналов 3.3в. По фронту сигнала latch дергается прерывание и засылаются нажатые кнопки. на приставке при уровнях сигналов 5в (без согласования уровней, напрямую latch,clk,d0 на GPIO5,18,23) может повезти, и проработает пару секунд, потом прерывание виснет. если поставить диоды на latch и clk - прерывание не просто виснет, а паникует и ребутится. |
| s_s:
Эту тему с преобразователями уровней я уже прошел --- Цитата: s_s от 28 Ноябрь 2019, 18:28:12 ---Напрямую не подключал SPI к плате Dendy, через преобразователь уровня 5*3,3. Перепробовал почти все варианты, и на резисторах и на диодах, во всех нарушалась осциллограмма сигналов со стороны 5В. Только подошел стандартный преобразователь 5*3,3В, это который на полевых транзисторах. --- Конец цитаты --- |
| xpk2k:
--- Цитата: xpk2k от 04 Декабрь 2019, 01:22:28 ---Смысла весь код с файлами выкладывать нет. Подправил слегка этот пример spi_slave для для того, чтобы ESP32 начала вести себя как джойстик, и по очереди строку символов по байту заправить в SPI3 код spi_slave: /* SPI Slave example, receiver (uses SPI Slave driver to communicate with sender) This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include <stdio.h> #include <stdint.h> #include <stddef.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "freertos/queue.h" #include "lwip/sockets.h" #include "lwip/dns.h" #include "lwip/netdb.h" #include "lwip/igmp.h" #include "esp_wifi.h" #include "esp_system.h" #include "esp_event.h" #include "esp_event_loop.h" #include "nvs_flash.h" #include "soc/rtc_periph.h" #include "esp32/rom/cache.h" #include "driver/spi_slave.h" #include "esp_log.h" #include "esp_spi_flash.h" #include "driver/gpio.h" /* SPI receiver (slave) example. This example is supposed to work together with the SPI sender. It uses the standard SPI pins (MISO, MOSI, SCLK, CS) to transmit data over in a full-duplex fashion, that is, while the master puts data on the MOSI pin, the slave puts its own data on the MISO pin. This example uses one extra pin: GPIO_HANDSHAKE is used as a handshake pin. After a transmission has been set up and we're ready to send/receive data, this code uses a callback to set the handshake pin high. The sender will detect this and start sending a transaction. As soon as the transaction is done, the line gets set low again. */ /* Pins in use. The SPI Master can use the GPIO mux, so feel free to change these if needed. */ #define GPIO_HANDSHAKE 0 #define GPIO_MOSI 23 #define GPIO_MISO 19 #define GPIO_SCLK 18 #define GPIO_CS 5 //Called after a transaction is queued and ready for pickup by master. We use this to set the handshake line high. void my_post_setup_cb(spi_slave_transaction_t *trans) { // WRITE_PERI_REG(GPIO_OUT_W1TS_REG, (1<<GPIO_HANDSHAKE)); } //Called after transaction is sent/received. We use this to set the handshake line low. void my_post_trans_cb(spi_slave_transaction_t *trans) { // WRITE_PERI_REG(GPIO_OUT_W1TC_REG, (1<<GPIO_HANDSHAKE)); } //Main application void app_main() { int n=0; esp_err_t ret; //Configuration for the SPI bus spi_bus_config_t buscfg={ .mosi_io_num=GPIO_MOSI, .miso_io_num=GPIO_MISO, .sclk_io_num=GPIO_SCLK }; //Configuration for the SPI slave interface spi_slave_interface_config_t slvcfg={ .mode=0, .spics_io_num=GPIO_CS, .queue_size=3, .flags=0, .post_setup_cb=my_post_setup_cb, .post_trans_cb=my_post_trans_cb }; //Configuration for the handshake line gpio_config_t io_conf={ .intr_type=GPIO_INTR_DISABLE, .mode=GPIO_MODE_OUTPUT, .pin_bit_mask=(1<<GPIO_HANDSHAKE) }; //Configure handshake line as output // gpio_config(&io_conf); //Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected. gpio_set_pull_mode(GPIO_MOSI, GPIO_PULLUP_ONLY); gpio_set_pull_mode(GPIO_SCLK, GPIO_PULLUP_ONLY); gpio_set_pull_mode(GPIO_CS, GPIO_PULLUP_ONLY); //Initialize SPI slave interface ret=spi_slave_initialize(VSPI_HOST, &buscfg, &slvcfg, 2); assert(ret==ESP_OK); WORD_ALIGNED_ATTR char sendbuf[129]=""; WORD_ALIGNED_ATTR char recvbuf[129]=""; memset(recvbuf, 0, 33); spi_slave_transaction_t t; memset(&t, 0, sizeof(t)); while(1) { //Clear receive buffer, set send buffer to something sane memset(recvbuf+1, 0xA5, 129); sprintf(sendbuf, "This is the receiver, sending data for transmission number %04d.", n); //Set up a transaction of 128 bytes to send/receive t.length=8; t.tx_buffer=sendbuf+n; t.rx_buffer=NULL; //recvbuf; /* This call enables the SPI slave interface to send/receive to the sendbuf and recvbuf. The transaction is initialized by the SPI master, however, so it will not actually happen until the master starts a hardware transaction by pulling CS low and pulsing the clock etc. In this specific example, we use the handshake line, pulled up by the .post_setup_cb callback that is called as soon as a transaction is ready, to let the master know it is free to transfer data. */ ret=spi_slave_transmit(VSPI_HOST, &t, portMAX_DELAY); //spi_slave_transmit does not return until the master has done a transmission, so by here we have sent our data and //received data from the master. Print it. printf("iteration %d Received: %s\n", n, recvbuf); printf("Sent [%d]bits: 0b%1d%1d%1d%1d%1d%1d%1d%1d\n", t.trans_len, !!(sendbuf[n]&0b10000000), !!(sendbuf[n]&0b01000000), !!(sendbuf[n]&0b00100000), !!(sendbuf[n]&0b00010000), !!(sendbuf[n]&0b00001000), !!(sendbuf[n]&0b00000100), !!(sendbuf[n]&0b00000010), sendbuf[n]&0b00000001); if (n++ >128) n=0; } } код spi_host (подправленный проект ArduinoGameController): #include "GameControllers.h" //shared pins between all controllers const int LATCH_PIN = 16; //connected to spi_slave GPIO_CS 5 const int CLOCK_PIN = 17; //connected to spi_slave GPIO_SCLK 18 //individual data pin for each controller const int DATA_PIN_0 = 18; //connected to spi_slave GPIO_MISO 19 GameControllers controllers; void setup() { Serial.begin(115200); //prepare serial for text output Serial.println("NES init."); //initialize shared pins controllers.init(LATCH_PIN, CLOCK_PIN); //activate first controller ans set the type to SNES Serial.println("Set controller NES."); controllers.setController(0, GameControllers::NES, DATA_PIN_0); } void loop() { controllers.poll(); //read all controllers at once if(controllers.pressed(0, GameControllers::START)) //check if Start was pressed since last loop Serial.println("Start was pressed."); if(controllers.down(0, GameControllers::A)) //if A button is hold down repeat after 20 loops Serial.print("A"); if(controllers.down(0, GameControllers::B)) //check if B button it's currently pressed down Serial.print("B"); if(controllers.down(0, GameControllers::SELECT)) //check if B button it's currently pressed down Serial.print("Select"); if(controllers.down(0, GameControllers::START)) //check if B button it's currently pressed down Serial.print("Start"); if(controllers.down(0, GameControllers::UP)) //check if B button it's currently pressed down Serial.print("Up"); if(controllers.down(0, GameControllers::DOWN)) //check if B button it's currently pressed down Serial.print("Down"); if(controllers.down(0, GameControllers::LEFT)) //check if B button it's currently pressed down Serial.print("Left"); if(controllers.down(0, GameControllers::RIGHT)) //check if B button it's currently pressed down Serial.print("Right"); delay(50); //read controller just ~20times a second } --- Конец цитаты --- Что оказалось забавным, этот код по сути рабочий, с одним "НО" - spi засылает биты инвертированными в двух смыслах слова "инвертировать". Если то, что первым отправляется 0b10000000 (начиная со старшего бита, в доках написано что в порядке битов 7:0, потом второй байт в порядке битов 15:8) нужно было просто вычитать в доках, то то, что отправка 0b00000000 - это высокий уровень на MISO... это было откровением для меня, т.к. все доки и картинки в них рисуют передачу бита 1 высоким уровнем напряжения на MOSI. Значит ли это, что та же логика кодирования бита верна для MISO не знаю. Получив более-менее стабильный результат от этого примера (на 2 процессора - один цикл, котрый только отправляет байт в SPI), перенес логику в общую кучу кода (где вся блютус муть и потоков разных, прерывания). И тут всплыло "НО №2" - биты засланные в SPI по неизвестной причине начинают задерживаться, растягиваться и "сползать", на более поздние фронты sclk, ну и какие-то непонятные "перепрыгивания" - отправляешь в SPI 0b10000000 (предварительно перекинув биты -> 0b01111111) - на принимающем конце 0b10010000, или например, заряжаешь в SPI 0b00010000 - вынимаешь 0b00000110, 0b00001000 - 0b00000011, 0b00000100 - 0b00000001, а 0b00000011 - 0b00000000. Cудя по картинкам логики кодирования данных джойстиком SPI в режиме slave срабатывает не на правильном фронте sclk: Вывод - SPI вовсе срабатывает в середине между фронтами. Вывод о причинах "сползания" делайте сами, но я решил, что драйвер SPI тормозит и не подходит. |
| s_s:
Atmega подходит, STM32 подходит, ESP32 что не подходит? --- Код: --- hspi1.SPI_CPOL=SPI_CPOL_High; // полярность сигнала SCK PI_POLARITY_LOW (CPOL=0) и SPI_POLARITY_HIGH (CPOL=1) hspi1.SPI_CPHA=SPI_CPHA_1Edge; // фаза сигнала SCK SPI_PHASE_1EDGE (CPHA=0) и SPI_PHASE_2EDGE (CPHA=1) --- Конец кода --- Существует четыре режима работы SPI устройств. Комбинация двух бит: CPOL (Clock Polarity) — определяет начальный уровень (полярность) сигнала синхронизации. CPOL=0 показывает, что сигнал синхронизации начинается с низкого уровня, так что передний фронт является нарастающим, а задний — падающим. CPOL=1, сигнал синхронизации начинается с высокого уровня, таким образом передний фронт является падающим, а задний — нарастающим. CPHA (Clock Phase) — фаза синхронизации, определяет по какому из фронтов синхронизирующего сигнала производить выборку данных. CPHA=0 показывает что необходимо производить выборку по переднему фронту, а CPHA=1 показывает что выборку данных необходимо производить по заднему фронту. |
| xpk2k:
Ну драйвер spi у esp32 какой-то свой и со своими особенностями: https://www.esp32.com/viewtopic.php?t=5788. Проверил все 4 варианта режима - разницы не заметил. Результат такой же как я писал раньше. Конвертер уровней спаял по схеме: Но это не помогло. |
| s_s:
Я, для первой пробы, так сказать проверки, сам уровни подавал, плюсик минусик, а data на светодиод, смотрел моргает нет. Atmega сразу пошла, там 5 вольт, без всяких преобразователей уровня. А Stm32, здесь если бы не осциллограф, я бы так и не знал, у HC368 и CPU вообще нагрузочной способности портов по ходу нет, изменялась форма осциллограммы сигналов latch и clk. Главное эти сигналы latch и clk подать, а data на осциллограф. В той ссылке пример spi_slave с DMA, как то у них DMA легко включается, это полный код? Вы осциллограммы смотрели? Вам отладчик доступен? |
| xpk2k:
Вкрутил уже упомянутый ранее код считывания данных из джойстика в arduino nano, чтоб работать с 5в логикой. Код считывает джойстик. Намерял несколько сигналов на дешевый цифровой осциллограф. На первой фотке - просто сигнал clk от ардуины. Осцилл. безбожно шумит, но уровень угадать можно. На второй - сигнал clk через диод. Фотка смазана, но вроде диод картину стгнала в общих чертах сохраняет. на третьей - нажата кнопка "лево" крестовины джоя, и сигнал с его data. на четвертой - наплевал на все кнопки - сигнал data прогнулся. Замерял что показывает конвертер уровней --- Цитата: xpk2k от 12 Декабрь 2019, 00:11:02 ---Ну драйвер spi у esp32 какой-то свой и со своими особенностями: https://www.esp32.com/viewtopic.php?t=5788. Проверил все 4 варианта режима - разницы не заметил. Результат такой же как я писал раньше. Конвертер уровней спаял по схеме: Но это не помогло. --- Конец цитаты --- Фоткать не стал, но сигнал clk конвертируется сносно. будем считтать, что так же как через диод. На пятой фотке - еще раз сигнал clk ардуинины. На шестой - засада в форме сигнала clk на приставке Bitman2. Причем на картинке выловлен хоть на что-то похожий сигнал, а в промежутках между - шарашит какой-то адский мусор. Так что, использование SPI под большим вопросом, да и мучаться писать на прерываниях - сомнительная затея. |
| xpk2k:
финал затеи. все трудности позади. кроме БТ-джойстиков прикрутил питание от микро-УСБ и через этот разъем можно прошивку esp32 менять не разбирая. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |