#include "stm32f10x.h"
#define CS_ON() GPIO_ResetBits(GPIOC, GPIO_Pin_0)
#define CS_OFF() GPIO_SetBits(GPIOC, GPIO_Pin_0)
uint8_t count = 0; //вывод числа на индикатор
void SPI_Ini (void) //функция настройки SPI1
{
SPI_InitTypeDef SPI_Init_Seg;
GPIO_InitTypeDef GPIO_Init_SPI;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_Init_SPI.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //настройка MISO,MOSI,SCK
GPIO_Init_SPI.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init_SPI.GPIO_Speed = GPIO_Speed_50MHz;
//РC.10 - SCK
//PC.11 - MISO
//PC.12 - MOSI
//PC.3 - CS
GPIO_Init(GPIOC, &GPIO_Init_SPI);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//настройка чип селект
GPIO_Init_SPI.GPIO_Pin = GPIO_Pin_3;
GPIO_Init_SPI.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init_SPI.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Init_SPI);
CS_OFF(); //выставляем чип селект в 1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
SPI_Init_Seg.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_Init_Seg.SPI_Mode = SPI_Mode_Master;
SPI_Init_Seg.SPI_DataSize = SPI_DataSize_16b;
SPI_Init_Seg.SPI_CPOL = SPI_CPOL_Low;
SPI_Init_Seg.SPI_CPHA = SPI_CPHA_1Edge;
SPI_Init_Seg.SPI_NSS = SPI_NSS_Soft;
SPI_Init_Seg.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_Init_Seg.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init_Seg.SPI_CRCPolynomial = 7;
SPI_Init(SPI3, &SPI_Init_Seg);
SPI_Cmd(SPI3, ENABLE);
}
////////////////////////////////
////////////////////////////////
void max7219_init1(void)
{
CS_ON(); //устанавливаем чип селект в 0
SPI_I2S_SendData(SPI3, 0x09); //отправляем первый пакет данных и указываем адрес режим декодирования
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)//по установки конца передачи при установке флага попадаем сюда (при отладке заходит)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);//сбрасываем флаг
}
SPI_I2S_SendData(SPI3, 0xFF); //отправляю второй пакет и настраиваю декодирование на всех индикаторах
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
CS_OFF(); //чип селект поднимаю в 1
CS_ON(); //чип селект в 0
SPI_I2S_SendData(SPI3, 0x0A); //настраиваем интенсивность свечения
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
SPI_I2S_SendData(SPI3, 0x07); //указываем интенсивность свечения (примерно ярко)
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
CS_OFF(); //чип селект в 1
CS_ON(); //чип селект в 0
SPI_I2S_SendData(SPI3, 0x0B); //адрес регистра отвечающего за количество работающих индикаторов
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
SPI_I2S_SendData(SPI3, 0x07); // выбираем все регистры
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
CS_OFF(); //чип селект в 1
CS_ON(); //чип селект в 0
SPI_I2S_SendData(SPI3, 0x0C); //адрес регистра режима сна
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
SPI_I2S_SendData(SPI3, 0x01); // выводим из сна
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
CS_OFF(); //чип селект в 1
CS_ON(); // чип селект в 0
SPI_I2S_SendData(SPI3, 0x0F); // адрес регистра "тест"
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
SPI_I2S_SendData(SPI3, 0x00); // режим тест выключен
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
CS_OFF(); //чип селект в 1
}
//////////////////////////////////////
//////////////////////////////////////
int main (void)
{
SPI_Ini();
max7219_init1();
while(1)
{
for(count = 0;count›9;count++) //вывод на индикатор 1
{
SPI_I2S_SendData(SPI3, 0x01);
if(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
}
SPI_I2S_SendData(SPI3, count);
}
}
} |