![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
0men
-
Постов
142 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Сообщения, опубликованные 0men
-
-
объявил. не помогло.
CDC_Send_DATA использует USBD_CDC_TransmitPacket? Посмотрите, что возвращают функции
-
Опубликовано · Изменено пользователем 0men · Пожаловаться
char strbuf[10]="";
вот это объявите вне функции - глобально. Она останется аргументом
-
strbuf попробуйте объявить как глобальный массив
-
для особо требовательного софта существует сертификация SIL - Safety Integrity Level. Остальное это все словоблудие
-
применяю HAL, код из куба только для первого ознакомления изредка
-
Опубликовано · Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого! · ПожаловатьсяM24M02-DRMN6
I2C_HandleTypeDef I2cHandle; void I2C_init( void ) { I2cHandle.Instance = I2C3; I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; I2cHandle.Init.ClockSpeed = 400000; I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9; I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; I2cHandle.Init.OwnAddress1 = 0xa0; // I2cHandle.Init.OwnAddress2 = 0xFE; __I2C3_CLK_ENABLE(); /* I2C SCL GPIO pin configuration */ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* I2C SDA GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); HAL_I2C_Init(&I2cHandle); } unsigned char EEPROM_write_byte ( uint32_t adr, uint8_t data ) { uint8_t i2c_adr = 0xa0; // set slave address for write if ((adr&0x10000) != 0) i2c_adr = 0xa2; if ((adr&0x20000) != 0) i2c_adr |= 0x04; while(HAL_I2C_Mem_Write(&I2cHandle, (uint16_t)i2c_adr, uint16_t(adr&0xffff), 2, &data, 1, 1000)!= HAL_OK); return( 0 ); } unsigned char EEPROM_write_page ( uint32_t adr, uint8_t * refdata ) { uint8_t i2c_adr = 0xa0; // set slave address for write if ((adr&0x10000) != 0) i2c_adr = 0xa2; if ((adr&0x20000) != 0) i2c_adr |= 0x04; while(HAL_I2C_Mem_Write(&I2cHandle, (uint16_t)i2c_adr, uint16_t(adr&0xffff), 2, refdata, 256, 1000) != HAL_OK); HAL_Delay( 6 ); return( 0 ); } unsigned char EEPROM_read_byte ( uint32_t adr, uint8_t * refdata ) { uint8_t i2c_adr = 0xa1; // set slave address for read if ((adr&0x10000) != 0) i2c_adr = 0xa3; if ((adr&0x20000) != 0) i2c_adr |= 0x04; while(HAL_I2C_Mem_Read(&I2cHandle, (uint16_t)i2c_adr, uint16_t(adr&0xffff), 2, refdata, 1, 1000)!= HAL_OK); return( 0 ); }
-
Я бы посмотрел, как Вы "HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов..." на самолетный блок поставили бы, и если ни дай бог оно откажет или вывалится в HardFault... Тенденция лепить говно везде, я смотрю, очевидно набирает обороты.
В общем, с Вами мне все понятно, обсуждать тут и нечего. Всего Вам наилучшего :laughing:
Не везде требуется самолетная надежность. Я вот использую HAL, максимальный уровень оптимизации, сотни проборов, годы эксплуатации, сбоев нет. Все зависит от задачи и от кривизны рук.
-
что то мне подсказывает, что просто не включен клок... __I2C1_CLK_ENABLE();
-
Опубликовано · Изменено пользователем 0men · Пожаловаться
содержимое MX_I2C1_Init покажите и перед while(1) напишите
__enable_interrupt();
-
Здравствуйте, у меня тут ребус
HAL_I2C_Master_Receive возвращает HAL_BUSY
....................................................................
так вы залезьте внутрь HAL_I2C_Master_Receive и посмотрите причину HAL_BUSY. Там не так много вариантов
-
Только сейчас дошло, что на самом деле, у меня такая картина: буферы A1,2,3 активно читаются одновременно другими задачами. То есть все 8 буферов пишутся одной задачей, а вот дальше идет асинхронное чтение из них разными задачами, причем активно используются именно три буфера, показывающие минимальную скорость общения.
Сейчас с кэшем поиграюсь....
Upd: А как мне кэш выключить? И вообще что там есть кэш при конкретно доступе к SDRAM? Кроме как "Burst read" ничего не вижу.
Возможно, когда буферы пишутся, контроллер сдрам пишет их, используя бурст, это самый быстрый доступ. При асинхронном чтении (записи) все значительно медленнее.
-
Дело точно не в СДРАМ. У меня контроллер памяти на циклоне, разницы в скорости доступа к разным банкам нет никакой
-
Да, имеется ввиду Repeated START Condition.
Только HAL_I2C_Master_Transmit кроме старта и отправки данных генерит STOP в конце). А он протоколом не предусмотрен
Впрочем, сейчас выясняется, что в документации на ds2482 не указано, что СТОП не мешает. Просто красавцы!
Вот вот ))) на самом деле, много где указано в протоколе, что требуется Repeated START, но на моем опыте всегда работает STOP с новым стартом
-
Опубликовано · Изменено пользователем 0men · Пожаловаться
Если бы пару байт.....Я тут с анализатором сижу, башка уже кипит.....
У этой ds2482 протокол идиотский (нужны повторные стартовые посылки во время передачи), а не просто послать или принять байт (с этим я бы я сюда не писал
)
Вопрос в том, как этого добиться от стандартного драйвера
под повторными вы подразумеваете Repeated START Condition?
// Write both Design Capacity bytes starting at 0x4A
data[1] = 0x46;
data[2] = 0x11;
while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)0xaa, &data[1], 2, 100)!= HAL_OK);
data[1] = 0x47;
data[2] = 0x30;
while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)0xaa, &data[1], 2, 100)!= HAL_OK);
исправлено: Repeated здесь не будет, но скажите страницу в доке где он так необходим? Строку с Repeated можно разбить на 2 отдельные посылки
-
Осцилограф-то есть, но декодировать цифру на нём - это садомазо
Что там декодировать то? Пару байт? Ваша задача правильно написать принцип записи байта и чтения байта. На этом все
-
без осциллографа пытаться скрестить слона и носорога? это фантастика
-
В первой серии даже встроенного pull-up нет. Но, тем не менее, повторюсь не в первый раз - для точного и быстрого определения отключения шнурка - VBUS.
USB_OTG_GOTGINT_SEDET как раз и работает с VBUS
Bit 2 SEDET: Session end detected
The core sets this bit to indicate that the level of the voltage on VBUS is no longer valid for a
B-Peripheral session when VBUS < 0.8 V
-
Да. Но VBUS должен быть подключен, иначе Вы постоянно будете висеть в этом прерывании.
И как решить вопрос с МК, у которых нет OTG? Например STM32F103? ...Хотя ТС озвучил F4xx серию, тем не менее, пускай вопрос будет риторический.
там, видимо, как то иначе, не работал с первой серией
-
Опубликовано · Изменено пользователем 0men · Пожаловаться
Куб уже научился и провода подпаивать?у него все уже подпаяно, если внимательно почитать.
куб определяет при вхождении в прерывание OTG_FS_IRQHandler через флаг USB_OTG_GOTGINT_SEDET
-
Опубликовано · Изменено пользователем 0men · Пожаловаться
Ваш - находится у вас, а у автора может быть другая схема.у меня тоже через куб, как и у автора. Это штатная переменная в кубе
-
Вопрос был о том, чтобы программно определить отключение шнурка устройства от порта.
мой вариант прекрасно работает :)
-
if (hUsbDevice_0 == 0) то шнурок отключен
-
Проц STM32F429.
если использовать HAL, то там есть такая каллбэк функция, которая вызовется при завершении транзакции SPI_DMATransmitCplt
-
Опубликовано · Изменено пользователем 0men · Пожаловаться
Ок!Раньше были светодиоды, но как только опытные образцы заработали стабильно от них отказались.
впаяйте в рабочую и нерабочую платы, посмотрите..
попробуйте купить несколько процессоров другой ревизии, в элитане есть С
Что еще можно попробовать, но это уже сродни танцу с бубном:
в LowLevelInit исправить AT91C_MC_FWS_1FWS на AT91C_MC_FWS_2FWS
Работа с VCP
в ARM
Опубликовано · Изменено пользователем IgorKossak
бездумное цитирование · Пожаловаться
Значит надо копать внутрь этих функций.