Jump to content

    

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

Share this post


Link to post
Share on other sites

Да, задвинуть первый байт, потом сразу второй. После этого дернуть вывод STCP.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
2 часа назад, Arlleex сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 часа назад, toweroff сказал:

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

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

 

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, Arlleex сказал:

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

STM32F051

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

Share this post


Link to post
Share on other sites
4 часа назад, toweroff сказал:

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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


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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this