/* MAX7219 Interaction Code * --------------------------- * For more information see * http://www.adnbr.co.uk/articles/max7219-and-7-segment-displays * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * wrote this file. As long as you retain this notice you * can do whatever you want with this stuff. If we meet some day, and you think * this stuff is worth it, you can buy me a beer in return. Shilov V.N. * ---------------------------------------------------------------------------- */ #include "max7219.h" #define SPI_PORT GPIOC #define SPI_SCK GPIO_PIN_5 #define SPI_MOSI GPIO_PIN_6 #define SPI_PINS (SPI_SCK|SPI_MOSI) #define SPI_LOAD_PORT GPIOD #define SPI_LOAD GPIO_PIN_3 #define GPIO_SetBits(port, pin) port->ODR |= (uint8_t)pin #define GPIO_ResetBits(port, pin) GPIOx->ODR &= (uint8_t)(~PortPins) void MAX7219_Config(void) { /* Set the MOSI,MISO and SCK at high level */ SPI_PORT->CR1 |= (uint8_t)SPI_PINS; /* Configure LOAD pin to Push-Pull, High, Fast*/ SPI_LOAD_PORT->ODR |= SPI_LOAD; SPI_LOAD_PORT->DDR |= SPI_LOAD; SPI_LOAD_PORT->CR1 |= SPI_LOAD; SPI_LOAD_PORT->CR2 &= (uint8_t)(~(SPI_LOAD)); /* Enable clock for SPI */ CLK->PCKENR1 |= 1 << 0x01; /* SPI_MODE_MASTER, SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_CLOCKPOLARITY_HIGH, SPI_CLOCKPHASE_2EDGE */ SPI->CR1 = 0x04 | 0x00 | 0x00 | 0x02 | 0x01; /* SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT */ SPI->CR2 = 0xC0 | 0x02 | SPI_CR2_SSI; /* SPI Enable */ SPI->CR1 |= SPI_CR1_SPE; /* Настройка MAX71219 */ MAX7219_WriteData(RegDecodeMode, 0x00); // все без BCD декодирования MAX7219_WriteData(RegScanLimit, MAX7219_DIGITS); // сколько цифр используем MAX7219_WriteData(RegIntensity, MAX7219_BRIGHT); // яркость из 16 MAX7219_WriteData(RegPower, MAX7219_ON); // включили питание } void MAX7219_WriteData(max7219_reg_t reg, uint8_t data) { /*!< Wait wait until the completion of the transfer. */ while ((SPI->SR & 0x80) != RESET); /* Down LOAD pin */ SPI_LOAD_PORT->ODR &= (uint8_t)(~SPI_LOAD); /*!< Wait until the transmit buffer is empty */ while ((SPI->SR & 0x02) == RESET); /* Send the register where the data will be stored */ SPI->DR = reg; /* Write in the DR register the data to be sent*/ /*!< Wait until the transmit buffer is empty */ while ((SPI->SR & 0x02) != RESET); /* Send the data to be stored */ SPI->DR = data; /* Write in the DR register the data to be sent*/ /*!< Wait wait until the completion of the transfer. */ while ((SPI->SR & 0x80) != RESET); /* Up LOAD pin */ SPI_LOAD_PORT->ODR |= SPI_LOAD; }