Ekka 0 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба Здравствуйте, возник такой вопрос. У меня соединены две микросхемы 74hc595, первая отвечает за выбор сегментов семисегментного индикатора, вторая - за выбор позиции (DIG1 или DIG2). По идее, нужно отправить по SPI 2 байта. Первый байт - указываем позицию dig (1 или 2), второй байт - сегменты. Передача старшим битом вперед. Не могу понять, как нужно переслать эти два байта. Сначала один байт, потом сразу второй и защелкнуться? Или как-то по-другому? код-говно. Но пока, все, что есть. Глупый вопрос, наверное, но все же. while(1) { CS_SET(); mas[0] = 0x01; mas[1] = 0x07; HAL_SPI_Transmit(&hspi1, mas, 2, 5000); while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); CS_STROB(); HAL_Delay(500); CS_SET(); mas[0] = 0; mas[1] = 0; HAL_SPI_Transmit(&hspi1, mas, 2, 5000); while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); CS_STROB(); HAL_Delay(500); CS_SET(); mas[0] = 0x10; mas[1] = 0x07;; HAL_SPI_Transmit(&hspi1, mas, 2, 5000); while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); CS_STROB(); HAL_Delay(500); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба Да, задвинуть первый байт, потом сразу второй. После этого дернуть вывод STCP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба Можно использовать слово не из 8 бит, а из 16 STCP повесить на аппаратный NSS SPI - данные защёлкнутся сами по фронту, не нужно ничего софтом делать 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба Нету в STM32 аппаратного NSS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба 2 часа назад, Arlleex сказал: Нету в STM32 аппаратного NSS. О как... Странно, почему у меня работает... Шайтан Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба Это ж атас просто... помнится, года три назад, TC как-бы разбирался с spi-ем, типа разобрался, и опять вопросы 8-( Не, нормально, раздел правильный, профильный, но... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба 2 часа назад, toweroff сказал: О как... Странно, почему у меня работает... Шайтан Контроллер какой? Возможно, я и поспешил с обобщением, но в тех МК STM32, с которыми я работал, фича аппаратного дергания CS была обманчива. Или Вы предлагаете каждый раз включать/выключать модуль SPI на каждую транзакцию? Костыльно-квадратноколесный способ, в котором ни DMA не заюзать, ни времянки CS/SCLK задать, ни еще чего-нибудь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба 1 час назад, Arlleex сказал: Контроллер какой? STM32F051 Думаю, это относится ко всей линейке F0xx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 октября, 2019 Опубликовано 12 октября, 2019 · Жалоба 4 часа назад, toweroff сказал: ...думаю, это относится ко всей линейке F0xx Посмотрел - все примерно одинаково в разных линейках. ИМХО, SPI в STM-ках остается полнейшей ботвой. Ну не научились ST делать SPI/I2C-интерфейсы, поэтому приходится колхозить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 октября, 2019 Опубликовано 13 октября, 2019 · Жалоба Кстати, так рисовать пересечения цепей, как показано на схемах, прогрессивное человечество отказалось лет 60 назад. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михась 2 13 октября, 2019 Опубликовано 13 октября, 2019 · Жалоба Да и диоды не по госту. Вспомнил, ка мне дали схему в которой не было ни одой точки на пересечении цепей. На претензию сказали - а што такого, вы же специалист. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 13 октября, 2019 Опубликовано 13 октября, 2019 · Жалоба ...не было ни одой точки на пересечении цепей... И не должно было быть, а вот если на соединении, тогда беда... но "вы же специалист" ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба Спасибо всем, кто отвечал. Сделано ногодрыгом. Так понятней и быстрее работает. может, кому пригодиться - вот #define DATA_PIN GPIO_PIN_7 #define LATCH_PIN GPIO_PIN_4 #define CLOCK_PIN GPIO_PIN_5 #define INP_PIN GPIO_PIN_6 #define PORT GPIOA #define LATCH_LOW() HAL_GPIO_WritePin(PORT, LATCH_PIN, GPIO_PIN_RESET) #define LATCH_HIGH() HAL_GPIO_WritePin(PORT, LATCH_PIN, GPIO_PIN_SET) #define DATA_LOW() HAL_GPIO_WritePin(PORT, DATA_PIN, GPIO_PIN_RESET) #define DATA_HIGH() HAL_GPIO_WritePin(PORT, DATA_PIN, GPIO_PIN_SET) #define CLOCK_LOW() HAL_GPIO_WritePin(PORT, CLOCK_PIN, GPIO_PIN_RESET) #define CLOCK_HIGH() HAL_GPIO_WritePin(PORT, CLOCK_PIN, GPIO_PIN_SET) void sendData_74hc595(uint16_t data) { LATCH_LOW(); for(int i=0; i<16; i++) { if(((data >> i) & 0x01) == 1) DATA_HIGH(); else DATA_LOW(); CLOCK_LOW(); CLOCK_HIGH(); } LATCH_HIGH(); } uint16_t receiveData_74hc595(void) { uint16_t receive_data = 0; LATCH_HIGH(); for(int i=0; i<16; i++) { CLOCK_LOW(); if(HAL_GPIO_ReadPin(PORT, GPIO_PIN_6) == 1) receive_data = receive_data |1 << (15-i); CLOCK_HIGH(); } return receive_data; } void init_74hc595(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = LATCH_PIN|CLOCK_PIN|DATA_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(PORT, LATCH_PIN, GPIO_PIN_SET); } Правда, здесь прием сделан на предмет просто того 0 или есть данные на ноге (так по задаче) отправка работает без ошибок, а вот прием вроде должен быть с той же А7 (у меня нужна 6 нога - так требуется), исправьте, если есть ошибки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться