Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
-26 / 4 / 0
Регистрация: 26.09.2024
Сообщений: 128

Передача данных по i2c через DMA STM32F401CUE6

08.10.2025, 13:46. Показов 4125. Ответов 95
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. При попытки передать данные на устройство по i2c через DMA нифига не выходит, DMA не в какую не хочет работать.

Адрес устройства определяется как надо, условие Старт и отправка адреса тоже происходит нормально но DMA не стартует и нет прерывания от DMA.
В отладке видно что бит DMA1_Stream6->CR |= DMA_SxCR_EN; устанавливается.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
I2C_HandleTypeDef hi2c1;
 
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
void DMA_Init(void);
uint8_t st7567a_IsDeviceReady(I2C_HandleTypeDef i2c);
void DMA_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pBuffer, uint8_t size);
void I2C_write(I2C_HandleTypeDef *hi2c, uint8_t Addr, uint8_t *pBuffer, uint16_t size);
//==============================================================================================================================
 
uint8_t addr_i2c;
uint8_t Buffer[10] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xFF};
//==============================================================================================================================
 
void DMA_Init(void)
{
  __enable_irq ();
  RCC->AHB1ENR|=RCC_AHB1ENR_DMA1EN;
  DMA1_Stream6->CR = 0 ;
  DMA1_Stream6->CR |= DMA_CHANNEL_6;
  DMA1_Stream6->CR |= DMA_SxCR_MINC;
  DMA1_Stream6->CR |= DMA_SxCR_DIR_0;
  DMA1_Stream6->CR |= DMA_SxCR_TCIE | DMA_SxCR_HTIE | DMA_SxCR_TEIE | DMA_SxCR_DMEIE;
  HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
}
//==============================================================================================================================
 
uint8_t st7567a_IsDeviceReady(I2C_HandleTypeDef i2c)
{
    for(uint8_t i = 0; i < 255; i++)
    {
        HAL_Delay(10);
        if(HAL_I2C_IsDeviceReady(&i2c, i, 3, 100) == HAL_OK)
        {
            return i;
        }
    }
    return 0;
}
//==============================================================================================================================
 
void DMA1_Stream6_IRQHandler(void)
{
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    if(DMA1->HISR & DMA_HISR_TCIF6)
    {
        DMA1->HIFCR &= ~ DMA_HIFCR_CTCIF6;
        DMA1_Stream6->CR&=~DMA_SxCR_EN;
        uint8_t temp __attribute__((unused)) = hi2c1.Instance->SR1 | hi2c1.Instance->SR2;
        hi2c1.Instance->CR1 |= I2C_CR1_STOP;
        while( !( hi2c1.Instance->CR1 & I2C_CR1_STOP )) ;
    }
    else if(DMA1->HISR & DMA_HISR_HTIF6)
        {
        DMA1->HIFCR &= ~ DMA_HIFCR_CHTIF6;
        }
    else if(DMA1->HISR & DMA_HISR_TEIF6)
            {
        DMA1->HIFCR &= ~ DMA_HIFCR_CTEIF6;
            }
    else if(DMA1->HISR & DMA_HISR_DMEIF6)
            {
        DMA1->HIFCR &= ~ DMA_HIFCR_CDMEIF6;
            }
}
 
//==============================================================================================================================
uint8_t tmp = 1;
void DMA_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pBuffer, uint8_t size)
{
    DMA1_Stream6->M0AR = (uint32_t)pBuffer;
    DMA1_Stream6->PAR=(uint32_t)&hi2c->Instance->DR;
    DMA1_Stream6->NDTR = size;
    hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
    DMA1_Stream6->CR |= DMA_SxCR_EN;
    tmp = 2;
}
//==============================================================================================================================
 
void I2C_write(I2C_HandleTypeDef *hi2c, uint8_t Addr, uint8_t *pBuffer, uint16_t size)
{
    while(hi2c->Instance->SR2&I2C_SR2_BUSY){;}
    hi2c->Instance->CR1 |= I2C_CR1_START | I2C_CR1_ACK;
    while( !( hi2c->Instance->SR1 & I2C_SR1_SB )){;}
    hi2c->Instance->DR = Addr;
    while( !( hi2c->Instance->SR1 & I2C_SR1_ADDR )){;}
    DMA_Transmit(hi2c, pBuffer, size);
}
 
int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
DMA_Init();
addr_i2c = st7567a_IsDeviceReady(hi2c1);
I2C_write(&hi2c1, addr_i2c, Buffer, 10);
while (1)
{
}
}
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 15;
  RCC_OscInitStruct.PLL.PLLN = 72;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
 
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}
 
static void MX_I2C1_Init(void)
{
 
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
}
 
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12|GPIO_PIN_15, GPIO_PIN_RESET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15
                          |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
 
  /*Configure GPIO pins : PC13 PC14 PC15 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PA0 PA1 PA2 PA3
                           PA4 PA5 PA6 PA7
                           PA8 PA9 PA10 PA11
                           PA12 PA15 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB0 PB1 PB2 PB10
                           PB12 PB13 PB14 PB15
                           PB3 PB4 PB8 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15
                          |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
  /*Configure GPIO pin : PB5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
}
void Error_Handler(void)
{
  __disable_irq();
  while (1)
  {
  }
}
Добавлено через 55 минут
Нашёл ошибку DMA1_Stream6->CR |= DMA_CHANNEL_6; исправил на DMA1_Stream6->CR |= DMA_CHANNEL_1; как в таблице всё равно не хочет заводиться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2025, 13:46
Ответы с готовыми решениями:

ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет?
Добрый день. Столкнулся с необходимостью писать большой объём данных АЦП с высокой скоростью....

USART2(RX+IDLE+DMA)+USART3(TX DMA)
Принимаю по юсарт2, побайтно, на скрости 115200. Пытаюсь передавать по юсарт3 через DMA, скорость...

STM32F4Discovery - ADC DMA и FSMC DMA
Привет всем. Вынужден опять обратиться за Вашей помощью :) Ситуация такая. 1. Дисплей...

95
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
13.10.2025, 19:57
Студворк — интернет-сервис помощи студентам
Eddy_Em, такая же фигня. Лет 8 назад ковырял одно такое устройство, на I2C типа. Чет не пойму, запросы вроде верные, посылки осликом смотрел - красивые... Почитал стандарт и тут опа: не соответствие.
Так что каждый сам давно решает что для него нынче означает I2C. Исходному протоколу не следует практически никто.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
13.10.2025, 20:14
Нашёл очередную засаду. Почему то при передачи DMA включает в отправку адрес устройства, а это лишний не нужный байт. Подскажите как сдвинуть адрес указателя на pBuffer; на один байт?
C
1
dma->Instance->M0AR = (uint32_t) pBuffer;
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
13.10.2025, 20:39
В стм32 есть аппаратная поддержка SPI-интерфейса. Это фактически тоже самое, что I2C.
1. Чем обусловлен выбор именно I2C?
2. Надеюсь, все понимают, что I2C разработан чисто для внутри-схемного обмена, т.е. одна микросхема на плате передает данные другой. Расстояния для этого протокола буквально 5-10 см.
3. Если его портировать на более дальние дистанции, придется снижать скорость обмена + учитывать сопротивление/емкость линии, на которой непременно завалятся фронты.

С SPI через DMA никаких проблем нет. В недавнем проекте через него управлял внешним ЦАПом.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
13.10.2025, 20:52
wizard41, да для дисплея пишу библы, а он только i2c поддерживает, да я тоже задумался не поднять ли на SPI куда лучше будет.
У меня всего одно устройство это GLCD который работает по i2c. То есть можно запустить на SPI?
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
13.10.2025, 20:53
Т.н. "high speed" I2C уже почти как SPI (но, по понятным причинам, т.к. нельзя пушпулл, то там источники тока вместо подтягивающих резисторов). Вот и вся разница физики, объясняющая, почему SPI выходит быстрей. А чувствительность к помехам у них примерно одинаковая. Поэтому SPI тоже далеко нельзя.

Не по теме:

Но вот с I2C я вполне себе до 2.5 метров датчики вешал от МК. На зеркале БТА висит 80 датчиков, подключенных к пяти контроллерам. Правда, пришлось скорость до 100к снизить (а на одном контроллере вообще до 10к, т.к. уж больно много длинных проводов). Ну, температура - штука медленная. На 2℃ зеркало в худших стрессовых условиях примерно за сутки температуру изменить может.


VladimirU, что за экранчик? Я, чесслово, вообще ни разу в жизни не встречал экранов на I2C - только на SPI или параллельной шине. Странно, зачем было искать именно I2C, когда SPI'ных - пруд пруди!
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
13.10.2025, 20:58
Цитата Сообщение от wizard41 Посмотреть сообщение
С SPI через DMA никаких проблем нет. В недавнем проекте через него управлял внешним ЦАПом.
Гыыы. Тоже так думал, пока не попытался подключать к нему микросхемы энкодеров и чтобы читать их на максимально возможной для них скорости и чтобы процессор мог еще чем-то полезным заниматься. Самый попс был с TLE5012B, который хочет полудуплекс. Но и с другими поводов поматериться хватило.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
13.10.2025, 21:09
Цитата Сообщение от Eddy_Em Посмотреть сообщение
до 2.5 метров датчики вешал
Я и до 50 метров использовал одно время, но применялись доп. ключи, которые раскачивали линию, ну и другие технологии помехо-защиты. Частоту придется снижать в любом случае.
VladimirU, дисплеев на чистом I2C не видел, не припомню таких... SPI точно почти все поддерживали, ну кроме совсем древних, параллельных.
SPI в стм - почти голый i2c, только с небольшими оговорками. Принцип тот же: уронить SYNC в ноль, по DATA передавать текущий бит, ну и CLK тактирует все это дело. Можно выбрать полярности тактирующих сигналов и синхронизации.

Добавлено через 4 минуты
Dushevny, ваш случай ни о чем не говорит. Как и что вы делали - никто не знает. И в чем выразились ограничения - не понятно. Могли быть как и ваши ошибки, так и неспособность ядра вывезти вашу затею..
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
13.10.2025, 21:18
Цитата Сообщение от Eddy_Em Посмотреть сообщение
что за экранчик?
GM12864-59N начал тестировать на вывод текста и заметил баги подключил лог. анализатор и увидел что первым байтом идёт адрес устройства хотя адрес устройства посылается самым первым перед вызовом потока DMA.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
14.10.2025, 08:28
wizard41, есть такие же дисплее только работающие по SPI пожалуй закажу их.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
14.10.2025, 09:04
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Я, чесслово, вообще ни разу в жизни не встречал экранов на I2C
Так обычные ssd1306, они зачастую распаяны на платке с I2C. И я сейчас не могу даже сказать есть ли возможность их подключить по SPI. То есть по даташиту-то можно, но вот выведены ли нужные ноги на шлейф?
Цитата Сообщение от wizard41 Посмотреть сообщение
В стм32 есть аппаратная поддержка SPI-интерфейса. Это фактически тоже самое, что I2C.
А можно пояснить что вообще общего между SPI и I2C?
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
14.10.2025, 09:27
Кстати, да: SPI к усарту ближе. И во многих STM32 можно усарт в SPI перевести.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
14.10.2025, 12:53
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
что вообще общего между SPI и I2C
Есть кое что. Не прямой аналог, конечно..

Цитата Сообщение от wizard41 Посмотреть сообщение
Это фактически тоже самое, что I2C
Тут я немного перемудрил, каюсь.

Добавлено через 3 минуты
VladimirU, дисплеи с I2C вроде как есть с припаянными к ним i2c-преобразователями. В чистом виде дисплеи прям со встроенным i2c что-то редкость..
С SPI полно.
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
14.10.2025, 13:02
Цитата Сообщение от wizard41 Посмотреть сообщение
со встроенным i2c что-то редкость..
Aliexpress-> "oled". Первые попавшиеся три:
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
14.10.2025, 13:10
Dushevny, как все изменилось то.. Раньше было не найти.
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
14.10.2025, 13:19
Цитата Сообщение от wizard41 Посмотреть сообщение
Раньше было не найти.
Плохо искали?

Хотя, конечно, если под "раньше" ималось ввиду лет 25 назад, то да - в те времена была либо параллельная шина, либо что-то похожее на симплексный SPI.
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
14.10.2025, 13:24
Цитата Сообщение от Dushevny Посмотреть сообщение
лет 25 назад
Хотя...

pc6222C2.pdf
Могу еще поковыряться в архивах. Просто вы плохо искали.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
14.10.2025, 13:39
Dushevny, лет 10-12 назад искал. Причем находясь в самом Китае..
Нужен был вроде LCD 16x2 с I2C. Не нашел, паял i2c переходник сам к нему.. С дисплеем типа ILI92.. та же проблема была.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
14.10.2025, 15:55
Цитата Сообщение от wizard41 Посмотреть сообщение
Есть кое что. Не прямой аналог, конечно..
Невероятно информативный ответ. Единственное сходство, которое я вижу - оба синхронные и последовательные.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
обычные ssd1306
Цитата Сообщение от wizard41 Посмотреть сообщение
В чистом виде дисплеи прям со встроенным i2c что-то редкость..
Цитата Сообщение от Dushevny Посмотреть сообщение
Aliexpress-> "oled". Первые попавшиеся три: {прим. на том же ssd1306}

Цитата Сообщение от wizard41 Посмотреть сообщение
Нужен был вроде LCD 16x2 с I2C.
Мне казалось, ардуиновские модули (HD44780 + переходник на I2C) испокон веков продаются.
Кстати о HD44780. Недавно делал одно устройство и с удивлением обнаружил, что этот индикатор наконец-то научился сам регулировать контрастность. А на соответствующую ножку не реагирует.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
14.10.2025, 17:01
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Невероятно информативный ответ. Единственное сходство, которое я вижу - оба синхронные и последовательные.
А вам принципиально надо было ответить? Тем более вы точно не тот, кому надо что-л. пояснять. Я же сказал "есть кое что". И это "кое что" действительно есть: окромя SYNC (у SPI) в остальном они практически одинаковы. Т.е. если опыт в i2c - переделать в spi не проблема.

С I2C не работаю много лет, т.к. он не применим в моем(их) случаях. Могу тонкостей не помнить. Есть, конечно, те, кто "натягивает сову на глобус" и юзают его на дальних дистанциях, но это далеко не комильфо.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
HD44780 + переходник на I2C
Удивитесь, но много чего что есть у нас из Китая - в самом Китае найти бывало трудно.
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
14.10.2025, 17:39
wizard41, на I2C полным-полно всяких "погодных" датчиков, вот, накалякал в блог.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2025, 17:39

stm32f407+ADC+DMA. Проблема с DMA
Доброго дня! Новичок в stm, первый проект, начальные наброски, не понимаю,почему не работает эта...

STM32F4 I2C DMA CMSIS
Парни может кто писал под f4 скиньте рабочий код если не жалко

stm32 SPI+DMA или I2C внешнее АЦП
Есть у меня задача контролировать 3фазы линейно .Внутренний ацп не подходит наверное.Какое ацп...

передача данных USART + DMA и непонятные иероглифы
Всем привет! Есть проблема с передачей данных с МК на ПК через USORT + DMA. Ранее все работало...

stm32f4 SPI приём и передача данных по DMA
Посмотрел я примеры по SPI .Как правильно осуществить передачу данных и приём ?Особенно путаница с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru