Перейти к содержанию
    

SPI 74HC595 x 2

Здравствуйте, возник такой вопрос. У меня соединены две микросхемы 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);
}

 

3kUpj4tC5qs.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно использовать слово не из 8 бит, а из 16

STCP повесить на аппаратный NSS SPI - данные защёлкнутся сами по фронту, не нужно ничего софтом делать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Arlleex сказал:

Нету в STM32 аппаратного NSS.

О как... Странно, почему у меня работает... Шайтан

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ж атас просто... помнится, года три назад, TC как-бы разбирался с spi-ем, типа разобрался, и опять вопросы 8-(
Не, нормально, раздел правильный, профильный, но...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, toweroff сказал:

О как... Странно, почему у меня работает... Шайтан

Контроллер какой?

 

Возможно, я и поспешил с обобщением, но в тех МК STM32, с которыми я работал, фича аппаратного дергания CS была обманчива.

Или Вы предлагаете каждый раз включать/выключать модуль SPI на каждую транзакцию?

Костыльно-квадратноколесный способ, в котором ни DMA не заюзать, ни времянки CS/SCLK задать, ни еще чего-нибудь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Контроллер какой?

STM32F051

Думаю, это относится ко всей линейке F0xx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, toweroff сказал:

...думаю, это относится ко всей линейке F0xx

Посмотрел - все примерно одинаково в разных линейках.

 

ИМХО, SPI в STM-ках остается полнейшей ботвой. Ну не научились ST делать SPI/I2C-интерфейсы, поэтому приходится колхозить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, так рисовать пересечения цепей, как показано на схемах, прогрессивное человечество отказалось лет 60 назад. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да и диоды не по госту. Вспомнил, ка мне дали схему в которой не было ни одой точки на пересечении цепей.  На претензию сказали - а што такого, вы же специалист. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...не было ни одой точки на пересечении цепей...


И не должно было быть, а вот если на соединении, тогда беда... но "вы же специалист" ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо всем, кто отвечал. Сделано ногодрыгом. Так понятней и быстрее работает. 

может, кому пригодиться - вот

 

#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 нога - так требуется), исправьте, если есть ошибки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...