Например TDA7294

Форум РадиоКот • Просмотр темы - STM32+MAX7219
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт апр 26, 2024 12:21:51

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: STM32+MAX7219
СообщениеДобавлено: Чт дек 10, 2020 21:56:58 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пн июл 31, 2017 10:53:04
Сообщений: 40
Рейтинг сообщения: 0
Приветствую. Пытаюсь подключить микросхемку MAX7219 к отладочной плате и включить линию светодиодов. Светодиодная панель молчит.
Пытался сделать следующее:
1. Понизить частоту SPI. Ставил Кд = 256. Нужные светодиоды включались, но вместе с ними выводился какой-то мусор.
2. Если понизить частоту, поставив Кд = 256 и воткнуть задержку
Код:
//HAL_Delay(1);
в функцию отправки байта, то все работает. Почему непонятно + хотелось бы обойтись без непонятных задержек
не могу понять, почему не работает.

Вот код:
Код:
#include "stm32f4xx_hal.h"

void init_SPI2(void);
void init_port(void);
void init_MAX7219(void);
void SPI2SendByte(uint16_t addr, uint8_t data);
void ClearMAX7219(void);

#define REG_NO_OP         0
#define REG_DIGIT_0      0x0100
#define REG_DIGIT_1      0x0200)
#define REG_DIGIT_2      0x0300)
#define REG_DIGIT_3      0x0400
#define REG_DIGIT_4      0x0500
#define REG_DIGIT_5      0x0600
#define REG_DIGIT_6      0x0700
#define REG_DIGIT_7      0x0800
#define REG_DECODE_MODE   0x0900
#define REG_INTENSITY      0x0A00
#define REG_SCAN_LIMIT      0x0B00
#define REG_SHUTDOWN           0x0C00
#define REG_DISPLAY_TEST   0x0F00
#define DISPLAY_TEKST 0xAA


void mymain(void) {
   init_port();
   init_SPI2();
   init_MAX7219();
   ClearMAX7219();
   while (1) {
      SPI2SendByte(REG_DIGIT_3, DISPLAY_TEKST);
   }
}


void init_MAX7219(void) {
   SPI2SendByte(REG_DECODE_MODE, 0x00);
   SPI2SendByte(REG_INTENSITY, 0x02);
   SPI2SendByte(REG_SCAN_LIMIT, 0x07);
   SPI2SendByte(REG_SHUTDOWN, 0x01);
   SPI2SendByte(REG_DISPLAY_TEST, 0x00);
}
void init_port(void) {
   //PA3 - CS ; PB10 -  SCK ; PC3 - MOSI
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // вкл тактирование порта А
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // вкл тактирование порта А
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // вкл тактирование порта А

   // вывод управления CS: выход двухтактный, общего назначения
   GPIOA->MODER |= GPIO_MODER_MODER3_0; // PA4 - не имеет альтернативной функции
   GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3_1;  // high_speed
   GPIOA->PUPDR |= GPIO_PUPDR_PUPD3_0 ; // pull-up
   GPIOA->BSRR |= GPIO_BSRR_BS3; // +VCC

   // вывод SCK: выход , альтернативная функция
   GPIOB->MODER |= GPIO_MODER_MODER10_1; // 5_1 - альтерн функция
   GPIOB->OSPEEDR |=  GPIO_OSPEEDER_OSPEEDR10_1; // high_speed
   GPIOB->PUPDR |= GPIO_PUPDR_PUPD10_1; // pull-down
   GPIOB->AFR[1] |= (0x05<<2*4); // альтернативная функция

   // вывод MOSI: выход , альтернативная функция,
   GPIOC->MODER |= GPIO_MODER_MODER3_1; // 3_1 - альтерн функция
   GPIOC->OSPEEDR |=  GPIO_OSPEEDER_OSPEEDR3_1; // high_speed
   GPIOC->PUPDR |=   GPIO_PUPDR_PUPD3_1; // pull-down
   GPIOC->AFR[0] |= (0x05<<3*4); // альтернативная функция
}

void init_SPI2(void) {
   RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; // вкл тактирование SPI
/*
 * двухпроводный режим (BIDIMODE  = 0)
 * CRC отсутствуует (CRCEN = 0)
 * данные - 8 бит (DFF = 0)
 * MSB - первый байт
 */
   SPI2->CR1 |= SPI_CR1_MSTR;              //Mode Master
   SPI2->CR1 |= SPI_CR1_BIDIMODE;  // 1 line
   SPI2->CR1 |= SPI_CR1_BIDIOE;    // MOSI
   SPI2->CR1 |= SPI_CR1_BR_0 ;                //Baud rate = Fpclk/4 = 30/4 = 7.5 МГц
   SPI2->CR1 |= SPI_CR1_DFF;                //16 бит посылка
   SPI2->CR1 &= ~SPI_CR1_CPOL;             //Polarity signal CPOL = 0;
   SPI2->CR1 &= ~SPI_CR1_CPHA;             //Phase signal    CPHA = 0;
   SPI2->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI; // включаем так как режим мастер. Nss актуальна только для слейва
   SPI2->CR1 |= SPI_CR1_SPE;                //Enable SPI2
}

void ClearMAX7219(void){
   SPI2SendByte(REG_DIGIT_0, 0x00);
   SPI2SendByte(REG_DIGIT_1, 0x00);
   SPI2SendByte(REG_DIGIT_2, 0x00);
   SPI2SendByte(REG_DIGIT_3, 0x00);
   SPI2SendByte(REG_DIGIT_4, 0x00);
   SPI2SendByte(REG_DIGIT_5, 0x00);
   SPI2SendByte(REG_DIGIT_6, 0x00);
   SPI2SendByte(REG_DIGIT_7, 0x00);
}

void SPI2SendByte(uint16_t addr, uint8_t data) {
   CS_RESET(); //активируем Chip Select
   while (!(SPI2->SR & SPI_SR_TXE));
      SPI2->DR = addr + data; //отправляем данные
   while (SPI2->SR & SPI_SR_BSY);
   CS_SET();
//   HAL_Delay(1);
}



Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: mab72 и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y