Jump to content

    
Sign in to follow this  
Ekka

SPI 74HC595 x 2

Recommended Posts

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

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

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

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
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

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

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

 

#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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this