STM32+MAX7219

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

STM32+MAX7219

Сообщение Cheeseman »

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

Реклама
Ответить

Вернуться в «ARM»