STM32 новичку в ARM что к чему
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
a5021, судя по вашему осциллографу у вас нестабильность частоты +-0,4ns (+-25кГц для 8МГц), а это 10-3, что вы еще хотите от RC генератора?
- Реклама
- Сообщения: 6460
- Зарегистрирован: Сб янв 28, 2006 22:47:24
Тем более от RC генератора соседствующего с туевой хучей цифровой логики и питающегося от одного с ними источника без развязки внутри одного корпуса. Джиттер в таких условиях обязательно будет присутствовать.
Но, следовало бы фронты импульсов к нормальному виду привести, нагрузкой выхода MCO и подключением щупа непосредственно к выводу. Думаю, дрожание обусловленное нестабильностью момента запуска развертки осциллографа заметно снизится.
Но, следовало бы фронты импульсов к нормальному виду привести, нагрузкой выхода MCO и подключением щупа непосредственно к выводу. Думаю, дрожание обусловленное нестабильностью момента запуска развертки осциллографа заметно снизится.
Астролябия-сама меряет, было бы что мерять!!!
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Да у него и кварц дрожит, обратите внимание, прыгает между 124,8 и 125,2 , а это уже +-13кГц.
Интересно кварц хоть запаян, или на штырьках?
Интересно кварц хоть запаян, или на штырьках?
- Сообщения: 6460
- Зарегистрирован: Сб янв 28, 2006 22:47:24
Да, есть чуть-чуть. Но у меня сейчас STM32F042 стоит в беспаечной макетной плате, там же кварц 4 МГц подключенный проводами по 50 мм. Но таких рывков фазы не наблюдается на MCO.
Еще раз замечу, что причина может быть не столько в генераторе, сколько в том, что синхронизация осциллографа сходит с ума из-за кривого "меандра".
И еще мы не знаем, что там с питанием и с разводкой общего провода.
Еще раз замечу, что причина может быть не столько в генераторе, сколько в том, что синхронизация осциллографа сходит с ума из-за кривого "меандра".
И еще мы не знаем, что там с питанием и с разводкой общего провода.
Астролябия-сама меряет, было бы что мерять!!!
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Чет происходящее все больше начинает напоминать виктимблейдинг -- когнитивное искажение, проявляющееся в том, что реальная картина мира плохо ложится на идеализированные представления об этом самом мире. Раз реальность идет вразрез с представлениями, то виновата, разумеется, реальность. Остается пустячок -- найти виноватых вовне: "дрожит триггер", "крутизна фронта гуляет", "кварц на штырьках", "кривой меандр", "что там с питанием" и т.п.
Голубая пилюля -- известная схема. Куда там запаян кварц и что с разводкой можно посмотреть в гугле. На подопытном экземпляре МК получает питание с XC6204 -- "highly precise, low noise, positive voltage LDO regulator" -- цитата с даташита.
Голубая пилюля -- известная схема. Куда там запаян кварц и что с разводкой можно посмотреть в гугле. На подопытном экземпляре МК получает питание с XC6204 -- "highly precise, low noise, positive voltage LDO regulator" -- цитата с даташита.
- Реклама
- Сообщения: 6460
- Зарегистрирован: Сб янв 28, 2006 22:47:24
А все же включите резистор ом на 470 между выходом и общим проводом, и прямо в ногу ему щупом осциллографа, в ногу.
Астролябия-сама меряет, было бы что мерять!!!
вы не способны допустить, что существует иная точка зрения, отличная от вашей? только дикари падки на все яркое-блестящее-звонкое, нормально развитым людям нужно нечто большее, чтобы возжелать обладать им.Мурик писал(а):Тот кто не хочет найти ни когда не найдет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="Asmodey",url="/forum/viewtopic.php?p=3931604#p3931604"]А все же включите резистор ом на 470 между выходом и общим проводом, и прямо в ногу ему щупом осциллографа, в ногу.[/uquote]
Вы советуете странное с этим самым резистором. Выход сконфигурирован, как push-pull 50MHz, что ставит жирный крест на надеждах что-то улучшить подгрузив пин резистором. Осциллом в ногу тыкал и картинка в области минимальных и максимальных уровней выглядит чуть лучше, но на частотно-фазовых характеристиках сигнала это никак не сказалось.
Вы советуете странное с этим самым резистором. Выход сконфигурирован, как push-pull 50MHz, что ставит жирный крест на надеждах что-то улучшить подгрузив пин резистором. Осциллом в ногу тыкал и картинка в области минимальных и максимальных уровней выглядит чуть лучше, но на частотно-фазовых характеристиках сигнала это никак не сказалось.
Подскажите пожалуйста,как настроить I2C в STM32F03
Пытаюсь освоить СТМ,дошел до I2C и не могу одолеть (COOCOX)
Пытаюсь освоить СТМ,дошел до I2C и не могу одолеть (COOCOX)
Одна цифра пропущена. F103 или F030?
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
На 103 все замечательно, а вот с 030 проблема, старт проходит и все, далее ничего не отправляется, позже выложу свой исходник (сейчас на работе)
Забросил,поставлю 103-й...
Забросил,поставлю 103-й...
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
код еще нужен, будете заниматься с кодом?Novice user писал(а):а вот с 030 проблема
Я вчера весь вечер гуглил, не нашёл, где то прочитал что I2C вSTM32F030 тот ещё геморр, старт/стоп идут норм, а
При отправке команд в место битов в SDA идут ноли (SCL идёт как положено)
Код ещё интересует, но сегодня проверить не смогу
У меня на плате распаян кроме STM ещё SSD1306, RDA5807, 4 кнопки, прошиваю стлинком
При отправке команд в место битов в SDA идут ноли (SCL идёт как положено)
Код ещё интересует, но сегодня проверить не смогу
У меня на плате распаян кроме STM ещё SSD1306, RDA5807, 4 кнопки, прошиваю стлинком
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Не знаю, я по началу думал что I2C вообще не работает, хотя у меня отладчика не было.Novice user писал(а):I2C вSTM32F030 тот ещё геморр,
Код взят с этого форума
Вот в том виде в котором у меня работает с модулем LCD I2C pcf8574, меня интересовала только передача
Спойлер
Код: Выделить всё
void init_I2C1(void)
{
RCC_I2CCLKConfig(RCC_I2C1CLK_HSI); // I2C Clock Mux - HSI
// Включаем тактирование нужных модулей
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
// Тактирование GPIO не включаю, т.к. оно уже включено в начале программы
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // Включаю тактирование I2C
// Настройка ног PA9, PA10
GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; // Режим альтернативной функции
GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10; // Открытый коллектор
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10; // Максимальная скорость GPIO_OSPEEDER_OSPEEDR9
// Выбор альтернативной функции
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4); // I2C1_SCL
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4); // I2C1_SDA
I2C_BUS->CR1 &= ~I2C_CR1_PE; // Отключаю I2C
while (I2C_BUS->CR1 & I2C_CR1_PE) {}; // Жду пока отключится
// Частота тактирования модуля I2C = 48 МГц
// Частота шины I2C = 100 kHz
// Настраиваю тайминги
/*I2C_BUS->TIMINGR |= \
(0xB << I2C_OFFSET_TIMINGR_PRESC)|\
(0x13 << I2C_OFFSET_TIMINGR_SCLL)|\
(0xF << I2C_OFFSET_TIMINGR_SCLH)|\
(0x4 << I2C_OFFSET_TIMINGR_SCLDEL)|\
(0x2 << I2C_OFFSET_IMINGR_SDADEL);
*/
I2C_BUS->TIMINGR = (uint32_t)0x2000090E;
I2C_BUS->CR1 |= I2C_CR1_PE; // Включаю I2C
while ((I2C_BUS->CR1 & I2C_CR1_PE)==0) {}; // Жду пока включится
}
/*
Выполняет транзакцию записи Size байт в регистр Register по адресу Adress.
Параметры:
Adress - адрес ведомого устройства
Register - регистр, в который хотим передать данные
Data - указывает откуда брать данные для передачи
Size - сколько байт хотим передать (от 1 до 254)
Возвращает:
1 - если данные успешно переданы
0 - если произошла ошибка
*/
//u8 I2C_Write_Transaction (u8 Adress, u8 Register, u8 *Data, u8 Size)
void I2C_Write_Transaction (uint8_t Adress, uint8_t Data)
{
// Старт
I2C_Start_Direction_Adress_Size (I2C_Transmitter, Adress, 1+1);//1+1);
// Отправляем байты до тех пор, пока не взлетит TC-флаг.
// Если взлетит NACK-флаг, отправку прекращаем.
while ((((I2C_BUS->ISR & I2C_ISR_TC)==0) && ((I2C_BUS->ISR & I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR & I2C_ISR_BUSY))
{
if (I2C_BUS->ISR & I2C_ISR_TXIS) I2C_BUS->TXDR= Data; // Отправляю данные
}
I2C_Stop();
}
/*
Это служебная функция, использовать её не нужно.
Устанавливает направление данных - приём или передача.
Задаёт объём пересылаемых данных.
Задаёт адрес ведомого устройства.
Выдаёт старт на шину.
Параметры:
Direction - направление (0-отправка, 1-приём)
Adress - адрес ведомого устройства
Size - размер данных (от 1 до 255 байт)
*/
void I2C_Start_Direction_Adress_Size (I2C_Direction Direction, uint8_t Adress, uint8_t Size)
{
if (Direction) I2C_BUS->CR2 |= I2C_CR2_RD_WRN; // Режим приёма
else I2C_BUS->CR2 &= ~I2C_CR2_RD_WRN; // Режим передачи
I2C_BUS->CR2 &= ~I2C_CR2_NBYTES; // Очистить размер данных
I2C_BUS->CR2 |= Size<<I2C_OFFSET_CR2_NBYTES; // Установить размер данных
I2C_BUS->CR2 &= ~I2C_CR2_SADD; // Очистить адрес ведомого устройства
I2C_BUS->CR2 |= (Adress << 1); // Установить адрес ведомого устройства
I2C_BUS->CR2 |= I2C_CR2_START; // Выдать старт на шину
while ((I2C_BUS->ISR & I2C_ISR_BUSY)==0) {}; // Ожидать выдачу старта
}
/*
Это служебная функция, использовать её не нужно.
Выдаёт стоп на шину.
Очищает флаги.
Проверяет наличие ошибок, очищает флаги ошибок.
*/
void I2C_Stop (void)
{
I2C_BUS->CR2 |= I2C_CR2_STOP; // Выдать стоп на шину
while (I2C_BUS->ISR & I2C_ISR_BUSY) {}; // Ожидать выдачу стопа
// Очищаю флаги - необходимо для дальнейшей работы шины
I2C_BUS->ICR |= I2C_ICR_STOPCF; // STOP флаг
I2C_BUS->ICR |= I2C_ICR_NACKCF; // NACK флаг
// Если есть ошибки на шине - очищаю флаги
if (I2C_BUS->ISR & (I2C_ISR_ARLO | I2C_ISR_BERR))
{
I2C_BUS->ICR |= I2C_ICR_ARLOCF;
I2C_BUS->ICR |= I2C_ICR_BERRCF;
}
}Здравствуйте.
Изучаю SPI на STM32f030. Не могу понять почему из регистра DR считывается не правильное значение.
Вначале выдается команда на чтение сигнатуры, затем чтение 3х байт. Читаются из DR 0xFF, 0xC8 и 0x40.
Должно быть 0xC8, 0x40, 0x16.

Если включаю строку LL_SPI_ReceiveData8(SPI1) то информация читается корректно.
Такое впечатление, что в SPI FIFO буфер. В интернете этот нюанс не нашел.
Изучаю SPI на STM32f030. Не могу понять почему из регистра DR считывается не правильное значение.
Спойлер
Код: Выделить всё
// Сигнатура
void w25qReadManuf(uint8_t *answer)
{
uint8_t status = W25Q_JEDEC_ID;
uint8_t i;
W25Q_CS_LO();
// Передать команду
while(!LL_SPI_IsActiveFlag_TXE(SPI1));
LL_SPI_TransmitData8(SPI1, status);
while(LL_SPI_IsActiveFlag_BSY(SPI1));
//LL_SPI_ReceiveData8(SPI1);//Очистка буфера
// Прочитать сигнатуру
for(i=0 ; i<3 ; i++)
{
LL_SPI_TransmitData8(SPI1,0xFF);
while(!LL_SPI_IsActiveFlag_RXNE(SPI1));
*(answer++) = LL_SPI_ReceiveData8(SPI1);
}
W25Q_CS_HI();
}
Должно быть 0xC8, 0x40, 0x16.
Если включаю строку LL_SPI_ReceiveData8(SPI1) то информация читается корректно.
Такое впечатление, что в SPI FIFO буфер. В интернете этот нюанс не нашел.
Последний раз редактировалось kvn234 Пт дек 18, 2020 00:45:53, всего редактировалось 1 раз.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="kvn234",url="/forum/viewtopic.php?p=3943137#p3943137"]Такое впечатление, что в SPI FIFO буфер.[/uquote]
Да, что в этом удивительного? Первый раз читается байт принятый при отправке status. По нормальному нужно перед чтением для RX FIFO делать flush:
А перед этим дождаться окончания передачи, для чего проверки BSY недостаточно, такое работало для SPI без FIFO. Должно быть так:
Да, что в этом удивительного? Первый раз читается байт принятый при отправке status. По нормальному нужно перед чтением для RX FIFO делать flush:
Код: Выделить всё
while (SPI1->SR & SPI_SR_FRLVL) SPI1->DR;Код: Выделить всё
while (SPI1->SR & (SPI_SR_FTLVL | SPI_SR_BSY)) {}Не нашел в интернете RM на мк?В интернете этот нюанс не нашел.
[uquote="Reflector",url="/forum/viewtopic.php?p=3943142#p3943142"][/uquote]
Спасибо.
Здесь понятно, буфер очищается.
Если будем дожидаться окончания передачи не попадем ли мы в бесконечный цикл, т.к. не происходит чтения DR ?
Спасибо.
Здесь понятно, буфер очищается.
Код: Выделить всё
while (SPI1->SR & SPI_SR_FRLVL) SPI1->DR;Код: Выделить всё
while (SPI1->SR & (SPI_SR_FTLVL | SPI_SR_BSY)) {}- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="kvn234",url="/forum/viewtopic.php?p=3943150#p3943150"]не попадем ли мы в бесконечный цикл, т.к. не происходит чтения DR ?[/uquote]
Дождаться нужно окончания передачи, там свое FIFO, чтение DR тут не при чем.
Дождаться нужно окончания передачи, там свое FIFO, чтение DR тут не при чем.
[uquote="Reflector",url="/forum/viewtopic.php?p=3943152#p3943152"][uquote="kvn234",url="/forum/viewtopic.php?p=3943150#p3943150"]не попадем ли мы в бесконечный цикл, т.к. не происходит чтения DR ?[/uquote]
Дождаться нужно окончания передачи, там свое FIFO, чтение DR тут не при чем.[/uquote]
Не увидел, что FIFO TX
Дождаться нужно окончания передачи, там свое FIFO, чтение DR тут не при чем.[/uquote]
Не увидел, что FIFO TX


