/* MAX7219 Interaction Code
 * ---------------------------
 * For more information see
 * http://www.adnbr.co.uk/articles/max7219-and-7-segment-displays
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <shilow@ukr.net> 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        GPIOB
#define SPI_CS          GPIO_Pin_4
#define SPI_SCK         GPIO_Pin_5
#define SPI_MOSI        GPIO_Pin_6
#define SPI_PINS        (SPI_SCK|SPI_MOSI)

void MAX7219_Config(void) {
    SPI_DeInit(SPI1);
    /* Enable clock for SPI */
    CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
    /* Set the MOSI,MISO and SCK at high level */
    GPIO_ExternalPullUpConfig(SPI_PORT, SPI_PINS, ENABLE);
    /* Configure LOAD pin */
    GPIO_Init(SPI_PORT, SPI_CS, GPIO_Mode_Out_PP_High_Fast);
    GPIO_SetBits(SPI_PORT, SPI_CS);
    /* Init SPI */
    SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_2, SPI_Mode_Master,
             SPI_CPOL_High, SPI_CPHA_2Edge, SPI_Direction_1Line_Tx, SPI_NSS_Soft, 0x00);
    /* SPI Enable */
    SPI_Cmd(SPI1, ENABLE);

    /* Настройка 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_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET) {}
    /* Down LOAD pin */
    GPIO_ResetBits(SPI_PORT, SPI_CS);

    /*!< Wait until the transmit buffer is empty */
    while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET) {}
    /* Send the register where the data will be stored */
    //SPI_SendData(SPI1, reg);
    SPI1->DR = reg; /* Write in the DR register the data to be sent*/

    /*!< Wait until the transmit buffer is empty */
    while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET) {}
    /* Send the data to be stored */
    //SPI_SendData(SPI1, data);
    SPI1->DR = data; /* Write in the DR register the data to be sent*/

    /*!< Wait wait until the completion of the transfer. */
    while (SPI_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET) {}
    /* Up LOAD pin */
    GPIO_SetBits(SPI_PORT, SPI_CS);
}
