Приветствую. Пытаюсь подключить микросхемку 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);
}