Jump to content
Grampus

Передача по SPI

Recommended Posts

Добрый день!

ПОМОГИТЕ ПОЖАЛУЙСТА!

в описании для одного дисплея нашел код для STM на СИ

там есть строчка которая мне не понятна, точнее смысл ее понятен но нет объявления аргументов функции

помогите пожалуйста. В общем ситуация такая 

 

spi_write ( DTA, 0x00 )                                     spi_write ( CMD, 0x01) 

вот эта функция

DTA - выполняет установку пина в 1 ,    CMD -  выполняет установку пина в 0 

0x00 , 0x01, .........0xFF     это либо данные либо команда. 

 и все бы ничего но все это нужно передать по HAL_SPI_Transmit 

помогите написать эту функцию с описанием аргументов и всех действий.

Share this post


Link to post
Share on other sites
20 минут назад, Grampus сказал:

в описании для одного дисплея нашел код для STM на СИ

Дык там описание или код??? Где С-код то??? Вижу только название функции, функции не вижу :(

По тому что ты написал помочь тебе не возможно - это бред какой то.


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
1 минуту назад, ruhi сказал:

Дык там описание или код??? Где С-код то??? Вижу только название функции, функции не вижу :(

По тому что ты написал помочь тебе не возможно - это бред какой то.

Вот фрагмент кода 

/** инициализация таблицы градаций яркости */
static void lcd_set_gray_scale(void)
{
   unsigned char cnt = 0;
   unsigned char step = 0x0C;
   unsigned char max_step = 0xB4;
   spi_write(CMD, 0xB8); /** таблица градаций яркости */
   for (cnt = step; cnt <= max_step; cnt += step)
      spi_write(DTA, cnt);
   spi_write(CMD, 0x00); /** разрешить работу таблицы градаций яркости */
}

static void lcd_set_col(unsigned char start, unsigned char end)
{
   spi_write(CMD, 0x15); /** Set Column Address */
   spi_write(DTA, start); /** начальный адрес */
   spi_write(DTA, end); /** конечный адрес */
}

static void lcd_set_row(unsigned char start, unsigned char end)
{
   spi_write(CMD, 0x75); /** Set Row Address */
   spi_write(DTA, start); /** начальный адрес */
   spi_write(DTA, end); /** конечный адрес */
}

static void lcd_set_start_line(unsigned char start)
{
   spi_write(CMD, 0xA1);
   spi_write(DTA, start);
}

static void lcd_set_wr_ram(void)
{
   spi_write(CMD, 0x5C); /** Разрешает микроконтроллеру записать данные в RAM */
}

static void lcd_current_control(unsigned char val)
{
   spi_write(CMD, 0xC7); // Master Contrast Current Control
   spi_write(DTA, (val > 0x0F) ? 0x0F : val);
}

/** очистка дисплея */
static void lcd_clr(void)
{
   unsigned int i = 0, j = 0;
   lcd_set_col(0x1C, 0x5B); /** 112 SEG до 367 SEG = 112 SEG / 4 до 367 SEG / 4 = 0x1C - 0x5B */
   lcd_set_row(0x00, 0x3F);
   
   for (i = 0; i < 64; i++)
   {
      lcd_set_wr_ram();
      for (j = 0; j < 128; j++)
         spi_write(DTA, 0x00);
   }
}
 

 

но тут тоже только функция есть а описание нету. 

 

Share this post


Link to post
Share on other sites

Обновленный ассортимент тактовых кнопок Omron!

Компэл предлагает обновленный ассортимент миниатюрных тактовых кнопок производства компании Omron, который включает в себя разнообразные решения как для стандартных условий, так и для применения в условиях повышенной влажности.

Подробнее

1 минуту назад, Grampus сказал:

void spi_write(unsigned char pin, unsigned char val)

Вроде как, ты эту функцию должен сам написать-реализовать.

Функция должна выполнять запись байта в СПАй и дожидаться окончания отправки.

как то так:

void spi_write(unsigned char pin, unsigned char val)

{

Set_Bit_function(pin);

HAL_SPI_Transmit(val);

}

И судя по тому что ты написал надо объявить:

#define CMD 0

#define DTA 1


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites

Вебинар «Экосистема MEAN WELL. Решения для любых задач электропитания» (20.05.2021)

Приглашаем 20 мая на вебинар, посвященный линейке поставок компании MEAN WELL и ее подходу к производству источников питания — как экосистемы продукции и услуг, которая позволяет подобрать оптимальный источник питания для любых задач электропитания. Рассмотрим весь спектр выпускаемой продукции MEAN WELL в области AC/DC-, DC/DC- и DC/AC-преобразователей с подробным разбором интересных и уникальных новинок, их применении и многое другое

Подробнее

8 минут назад, ruhi сказал:

Вроде как, ты эту функцию должен сам написать-реализовать.

Функция должна выполнять запись байта в СПАй и дожидаться окончания отправки.

как то так:

void spi_write(unsigned char pin, unsigned char val)

{

Set_Bit_function(pin);

HAL_SPI_Transmit(val);

}

И судя по тому что ты написал надо объявить:

#define CMD 0

#define DTA 1

да, но мне нужно ( если я правильно понял) дисплею по СПАй сказать это команда или данные и потом еще байт отправить! 

просто байт данных могу отправить, а нужно одновременно отправить CMD или DTA  и байт

т.е. всю функцию отправить в СПАй.

 

Share this post


Link to post
Share on other sites

Трансиверы ADIN1200 и ADIN1300 от Analog Devices для промышленного Ethernet

ADIN1200 и ADIN1300 – микросхемы физического уровня Ethernet (PHY), разработанные ADI для современных промышленных систем Ethernet реального времени. Микросхемы ориентированы на применения в промышленной автоматике, автоматизации зданий, заводов, робототехнике и управлением движением, а также в промышленном интернете вещей (IIoT).

Подробнее

@Grampus Ну что вы за люди. У дисплея название есть? Как отвечать на такие вопросы. Данные/Команда могут передаваться или по СПИ или внешней ногой.

Share this post


Link to post
Share on other sites
7 минут назад, Grampus сказал:

сказать это команда или данные

дак вот эту функцию

Set_Bit_function(pin);

еще надо написать, или просто код сброса установки пина в зависимости от значения параметра, как то так:

void spi_write(unsigned char pin, unsigned char val)

{

if(pin == 1) set(PORTX.PINY);

else clear(PORTX.PINY);

...

 

там должна быть какие то функции ХАЛа типа:

HAL_Set_Port и/или HAL_Clear_Port

Если следовать:

57 минут назад, Grampus сказал:

DTA - выполняет установку пина в 1 ,    CMD -  выполняет установку пина в 0 

 

Edited by ruhi
добавил

Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
2 минуты назад, MasterElectric сказал:

@Grampus Ну что вы за люди. У дисплея название есть? Как отвечать на такие вопросы. Данные/Команда могут передаваться или по СПИ или внешней ногой.

WEX025664BLPP3N00000    дисплей

SSD1322  контроллер дисплея 

Share this post


Link to post
Share on other sites

Если Вы используете 4-проводный SPI, то D/C определяется по отдельной линии порта.

Если же 3-проводный, то D/C добавляется 9-м битом к слову данных и идет первым.

Какой вариант у Вас? 

Share this post


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

и все бы ничего но все это нужно передать по HAL_SPI_Transmit 

Вся проблема решает выкидыванием нафиг говноHALa и тратой 10 минут на написание своей функции работы с SPI.

Share this post


Link to post
Share on other sites

Господа благодарю всех, в общем сделал так :

void spi_write ( uint8_t d, uint8_t OLED_DATA)
{
if(d==1)
GPIOB->BSRR |= GPIO_BSRR_BS_8;       // установили пин в 1 - передаем данные

if(d==0)
GPIOB->BSRR |= GPIO_BSRR_BR_8;      // установили пин в 0 - передаем команду


 HAL_SPI_Transmit_DMA (&hspi1, OLED_DATA_i, sizeof(OLED_DATA));        // передаем по spi 
 OLED_DATA_i [0] = OLED_DATA;
}

 

Share this post


Link to post
Share on other sites
void spi_write ( uint8_t d, uint8_t OLED_DATA)
{
  if(d)GPIOB->BSRR = GPIO_BSRR_BS_8;  // установили пин в 1 - передаем данные
  else
  GPIOB->BSRR = GPIO_BSRR_BR_8;  // установили пин в 0 - передаем команду


 HAL_SPI_Transmit_DMA(&hspi1, OLED_DATA_i, sizeof(OLED_DATA));  // передаем по spi 
 OLED_DATA_i[0] = OLED_DATA;
} 

найдите 10 различий

Edited by MasterElectric

Share this post


Link to post
Share on other sites
В 03.12.2018 в 22:33, MasterElectric сказал:

void spi_write ( uint8_t d, uint8_t OLED_DATA)
{
  if(d)GPIOB->BSRR = GPIO_BSRR_BS_8;  // установили пин в 1 - передаем данные
  else
  GPIOB->BSRR = GPIO_BSRR_BR_8;  // установили пин в 0 - передаем команду


 HAL_SPI_Transmit_DMA(&hspi1, OLED_DATA_i, sizeof(OLED_DATA));  // передаем по spi 
 OLED_DATA_i[0] = OLED_DATA;
} 

найдите 10 различий

Добрый день! я до сих пор воюю с дисплеем  WEX025664CLPP3N00000, в сети нашел описание подключения к AVR МК, с помощью библиотеки U8glib. 

Подскажите пожалуйста могу ли я использовать эту библиотеку для STM32. Я не умею подключать сторонние библиотеки! ((( 

Share this post


Link to post
Share on other sites

На сколько помню дисплеи SPI работают так ставим ножку D/C выбором команда, или дата, потом строб в 1 запись данных в регистр данных после строб вниз.

С АВР перенести не проблема, только время нужно тратить, я так ардуиновские библиотеки под себя для СТМ по регистрам делал, главное понять по библиотеке что нужно, потом сконфигурировать под СТМ интерфейсы, и по алгоритмам библиотеки написать свои функции и все.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.

Loading...

  • Сообщения

  • Similar Content

    • By Михаил Дементьев
      Всем добрый день!
      Столкнулся с такой проблемой. Собрал самодельный igbt, и все хорошо работает, пока подаю на затвор напряжение с источника. Далее через ЦАП подключил stm32f100 к затвору и попытался управлять выходным током биполярника. В итоге вот что получилось: тестирую stm32 без igbt, ЦАП стабильно выдаёт то, чем я прошил микроконтроллер, но как только stm32 подключаю к затвору igbt, то stm32 перестаёт работать, в чем может быть проблема?
    • Guest Тот самый чайник
      By Guest Тот самый чайник
      Добрых времени суток, недавно начал изучать микроконтроллер STM32. Уже собрал контроллер в виде схемы, но не могу понять пару моментов а именно с подключением к нему датчиков. (буду благодарен если картинками кинете ещё).

      Микроконтроллер я как понял он питается и управляется с помощью 3.3В а 5В нежелательно,  поскольку мк может сгореть. Хотя многие говорят можно подать, а в дотушите нету упоминания, можете разъяснить этот момент. (знаю можно устранить с помощью подтягивающего резистора, но всё же, хочу знать от мнение асов и кто уже просветлён).

      Есть датчики температуры, уровень жидкости и её температура, скорости вращения. Их я как понимаю можно подключить на МК через усилитель, ФНЧ и комутатор аналоговых сигналов а затем на МК пустить. (питание через гальваническую развязку сделаю), так можно делать? Интересует схема этих датчиков которые я перечислил, желательно для промышленности поскольку не могу выбрать а какие-то не могу найти потому что не знаю что поставить. 

      Ещё читал что аналоговые датчики можно подключать напрямую из датчиков к МК (через делитель). Что скажите?

      И такой момент, на МК есть вводы и выводы. Т.е. программно в них можно прописать какой пин будет вводом а какой выводом? Дискретным или аналоговым, можете рассказать? Или на статью с разъяснением скиньте.

      Пока что так.

       
    • By admin
      В видео поговорим об энергоэффективности микроконтроллеров. Сравним потребление в режима сна arduino, blue pill с STM32F103 и представителя новой линейки энергоэффективных микроконтроллеров от st — STM32L552.
      Подробную информацию об линейке L5 можно найти тут: https://www.compel.ru/lib/143383
      Пи тест часть 1: https://youtu.be/ozu1IUjH1_Q
      Пи тест часть 2: https://youtu.be/uLOWYE-JJpA
    • By Стальной
      Доброго времени суток!
      Неделю не могу запустить DCMI на STM32F407VET6. 
      Работаю через HAL, инициализация кубом. К МК подключена камера OV7670. Камера дает картинку 640х480, и такое изображение мне негде хранить. Поэтому через фичу CROP хочу вырезать картинку 160х128 из центра под имеющийся экран.
      Ниже примерный код, без настройки камеры. Камера тактируется от 16 МГц MCO. Сигналы поступают на выводы МК, посмотрел осциллографом. У камеры есть некоторые настройки, которые тут в коде не показал, так как они влияют только на представление данных, но не на алгоритм захвата данных.
      /* USER CODE BEGIN PV */ uint16_t DCMI_data[20480] = {0}; //128*160=20480 words uint32_t ptr; /* USER CODE END PV */ //тут еще код куба, пропущу его int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_DCMI_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); //снять ресет с матрицы ptr = (uint32_t)(&DCMI_data[0]); HAL_Delay( 500 ); //начать резать с 512 клока строки (256 пиксель), начать резать с 160 строки //захватить 256 клоков (128 пикселей), захватить 160 строк HAL_DCMI_ConfigCrop(&hdcmi, 512, 160, 256, 160); HAL_DCMI_EnableCrop(&hdcmi); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, ptr, 10240); //однократный захват, 10240 тетрад, 20480 слов, 160*128=40960 пикселей HAL_Delay(1500); } /* USER CODE END 3 */ } В результате в буфере ничего не появляется, DMA туда ничего не кладёт, проверил. Если не вызывать функцию EnableCrop, но какие-то данные появляются, но на экран их корректно отобразить не получается. Также пытался в камере обрезку включить, а не в МК - снова нет данных. Пробовал разные частоты тактирования матрицы давать - без разницы. Отладчиком увидел, что бит EN в регистре конфигурации потока  DMA не снимается, как будто DMA не получал запросов на транзакции. Помогите, пожалуйста, разобраться.
      Проект на яндексДиске
    • By Карен Григорян
      Здравствуйте, товарищи форумчане!
      У меня вот такая проблемка: есть такая схема:

      По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
      Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
        while (1)
        {
              HAL_ADC_Start_IT(&hadc1);
              HAL_Delay(10);
      }
      Код колбека прерывания:
      void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
          if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
          {
            int adc = HAL_ADC_GetValue(&hadc1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
          }
              }
      На всякий случай вот настройка АЦП в stm32:

      Вот пример неправильного вычисления:

×
×
  • Create New...