Кто любит RISC в жизни, заходим, не стесняемся.
Чт авг 03, 2023 17:59:14
Потому что:
a) while (!(SPI1->SR & SPI_SR_RXNE)); - ожидает завершения передачи слова.
b) читать принятое надо ПОСЛЕ появления флага готовности, а не ДО.
в) читать надо командой data = *(uint8_t volatile *)&SPI1->DR; а не как у вас.
г) писать нужно также через (uint8_t volatile *) указатель, а не как у вас.
Чт авг 03, 2023 18:55:09
zenon,
1- SPI у F1 и F0 разный, в первом нет FIF0 очереди, источники для подглядывания надо выбирать соответствующие;
2- флаги TXE, RXNE можно сказать здесь относятся к очереди, а не процессу передачи - что приводит к тому, что Вы шурудите линеей DC прям во время передачи уходящего байта.
в оригинале :
while (!(SPI1->SR & SPI_SR_RXNE)); - дождаться ухода/прихода (здесь это одно и то же) байта
data = *(uint8_t *)&SPI1->DR; - прочитать DR чтоб снялся флаг RXNE (чтение SR потом DR - снимает флаг)
VladislavS,
спасибо. про доступ при записи на глаза не попалось, а про чтение нашел в RM - требует соответствия доступа.
м-да, тяжко когда уровень инглиш не в "свободном чтении".
Пт авг 04, 2023 03:20:09
Нда... мне читать-то не надо, только быстро передавать, и это... volatile в этом моменте тут не при чём.
a797945 шурудить не буду, сначала правильно делал.
;_)
Что-то мне подсказывает, что на самом деле я не переключаюсь на 8 бит.
Пт авг 04, 2023 07:26:30
в пакетах, где частая смена линии DC (инит дисплея), ожидание завершения передачи байта, перед сменой сост. линии DC - неизбежность.
в пакетах, где DC менять не надо - в рукопашную не передают , используют DMA.
Пт авг 04, 2023 11:04:32
в пакетах, где частая смена линии DC (инит дисплея), ожидание завершения передачи байта, перед сменой сост. линии DC - неизбежность.
"неизбежность" это только для тех, кто контроллер не умеет подходящий выбрать. Если выбрать такой, который сможет аппаратно управлять этой линией и создать соответствующую схему, то и ждать ничего не потребуется - можно сразу выплюнуть всю посылку с командой и данными совместно и через DMA. Но без использования головы тут не обойтись, это точно.
Пт авг 04, 2023 11:49:38
Ха,
jcxz бесячий же ты типчик, а родился ты наверное сразу со всеми интерфейсами, периферией и готовой прошивкой?
До DMA ещё не добрался, что до выбора мк - разбираюсь с чем есть, спешить некуда, ошибок ну сами знаете у кого нет.
ps. Нашёл
старую тему по дисплею, пойду полистаю.
Пт авг 04, 2023 19:59:54
В F0 можно проверять флаг BUSY. Означает что передача не окончена. Ждать пока BSY=0 и потом можно дергать DC.
Пт авг 04, 2023 20:33:21
Для F103 можно скачать работающий пример для дисплея на " Частотомер на GD32F303" соседний форум
Пт авг 04, 2023 21:18:26
В F0 можно проверять флаг BUSY. Означает что передача не окончена. Ждать пока BSY=0 и потом можно дергать DC.
...Ждать когда BSY=0...
на быстром коде может потребоваться небольшая задержка после записи в DR до проверки BSY, он не сразу вскакивает.
Пт авг 04, 2023 22:39:47
Да BSY то всё
понятно было вопрос вообще изначально не о том был... фиг с ним, работает же. Дойдут руки, анализаторм посмотрю, яснее будет.
Сб авг 05, 2023 09:20:19
непонятно было, когда Вы вопрос задали не приводя контекст, вот и ответ был - не надо читать - не читайте.
а код привели, стало понятно - вывод байта обрамляется сиг.DC, а как узнать когда можно уже дергать DC? -вот и ждут RXNE, а уже чтобы сбросить флаг - читают DR, можно в никуда.
когда не надо рулить DC - по TXE (движению очереди) грузят DR, но обычно не в ручную - DMA для этого есть.
Сб авг 05, 2023 10:00:30
Так я сам не сразу понял про DC, а первый раз вышеупомянутую ссылку на хабре прочёл по диагонали, не знаю как у кого, у меня окончательное понимание в железке происходит.
Сб авг 12, 2023 23:12:10
Добрый вечер! Передаю по USART2 байт с терминала и тут же его возвращаю. Не могу понять, почему возвращается число больше.... Передаю 7 - возвращается 37, передаю 8 - возвращается 38.
Спойлер
RCC -> APB1ENR |= RCC_APB1ENR_USART2EN; // Включение тактирования USART2
GPIOA -> MODER |= GPIO_MODER_MODE2_1; // Альтернативная функция для РА2 (USART2- TX)
GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL2_0 | GPIO_AFRL_AFSEL2_1 | GPIO_AFRL_AFSEL2_2; // Альтернативная функция для РА2 - AF7
GPIOA -> MODER |= GPIO_MODER_MODE3_1; // Альтернативная функция для РА3 (USART2- RX)
GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL3_0 | GPIO_AFRL_AFSEL3_1 | GPIO_AFRL_AFSEL3_2; // Альтернативная функция для РА3 - AF7
// APB1_CLK = 42 MHz
// 42'000'000/115200/16 = 22.79 Mantissa = 22(0x16), Fraction = 0.79*16 = 12(0xC)
USART2 -> BRR |= 0x16C;
USART2 -> CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; // Включение передатчика и приемника, прерываний
USART2 -> CR1 &= ~(USART_CR1_PCE | USART_CR1_M); // 8 бит, без контроля четности
USART2 -> CR2 &= ~USART_CR2_STOP; // один стоповый бит
NVIC_EnableIRQ(USART2_IRQn);
USART2 -> CR1 |= USART_CR1_UE; // включение USART2
// // Прием символа по USART2 - принимаем с терминала и передаем на радиомодуль
void USART2_IRQHandler(void) { // Прием символа по USART2
if (USART2 -> SR & USART_SR_RXNE) {
uint8_t RXc = ((USART2 -> DR) & 0xFF); // Считываем значение регистра DR
switch (RXc) {
case 0x37:
LED_on;
break;
default:
LED_off;
break;
}
USART2_Send_symbol(RXc);
}
NVIC_ClearPendingIRQ(USART2_IRQn);
}
// Передача символа USART
void USART2_Send_symbol(uint8_t data)
{
while(!(USART2->SR & USART_SR_TC)); // Флаг окончания передачи (1 - передача завершена)
USART2->DR = data;
}
- Вложения
-
- 1.jpg
- (225.46 KiB) Скачиваний: 27
Сб авг 12, 2023 23:24:02
Я так подозреваю, принимаете число, передаёте символ...
Сб авг 12, 2023 23:31:09
Я так подозреваю, принимаете число, передаёте символ...
Я проверял внутри условия case - он уже принимает 0x37, а не 7
Вс авг 13, 2023 00:05:32
0x37, а не 7
Вам же объяснили. 0х37 это ASCII код СИМВОЛА СЕМЬ. Вы передаете не число, а код символа.
Можете передать так любую букву или знак.
Символы чисел отличаются от самих чисел на величину 0х30.
Вс авг 13, 2023 00:16:12
0x37, а не 7
Вам же объяснили.
Сообразил. Спасибо. Странно, вроде в терминале hex ставлю
Вс авг 13, 2023 00:21:33
Я терминалом не пользуюсь, но полагаю, что из него всегда передаются ASCII коды ТЕКСТА, включая цифры, а не числа.
Вс авг 13, 2023 00:30:28
Я терминалом не пользуюсь, но полагаю, что из него всегда передаются ASCII коды ТЕКСТА, включая цифры, а не числа.
Да, проверил. Именно так. Поставил точку напротив ascii и так и отображается как передаю. Получается, ничего преобразовывать не надо (вычитать 30)?
Допустим, надо через усарт передать на spi число 0хС0.
Пт авг 18, 2023 19:24:21
Всем добра! имеется stm32f030т6 пытаюсь снять ацп с двух каналов. один работает хорошо. он снимает все работает но иногда их меняет местами как поборот?
inet:
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
GPIOA->MODER |= GPIO_MODER_MODER5_0 ;
GPIOA->MODER |= GPIO_MODER_MODER5_1 ;
GPIOA->MODER |= GPIO_MODER_MODER2_0 ;
GPIOA->MODER |= GPIO_MODER_MODER2_1 ;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; /* (1) */
RCC->CR2 |= RCC_CR2_HSI14ON; /* (2) */
while ((RCC->CR2 & RCC_CR2_HSI14RDY) == 0) /* (3) */
{
}
CalibrateADC();
ADC1->CFGR1 |= ADC_CFGR1_CONT | ADC_CFGR1_SCANDIR; /* (2) */
ADC1->CHSELR |= ADC_CHSELR_CHSEL2;
ADC1->CHSELR |= ADC_CHSELR_CHSEL5;
EnableADC();
ADC->CCR |= ADC_CCR_VREFEN; /* (6) */
в main:
ADC1->CR |= ADC_CR_ADSTART; /* start the ADC conversion */
while ((ADC1->ISR & ADC_ISR_EOC) == 0) /* wait end of conversion */
{
/* For robust implementation, add here time-out management */
}
if ((ADC1->ISR & ADC_ISR_EOC) != 0) /* checks EOC has triggered the IT */
{
ADC_array[CurrentChannel] = ADC1->DR; /* reads data and clears EOC flag */
CurrentChannel++; /* increments the index on ADC_array */
}
if ((ADC1->ISR & ADC_ISR_EOSEQ) != 0) /* checks EOSEQ has triggered the IT */
{
ADC1->ISR |= ADC_ISR_EOSEQ; /* clears the pending bit */
CurrentChannel = 0; /* reinitialize the CurrentChannel */
out_adc = ADC_array[0];in_adc = ADC_array[1];
}
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.