Итак:
RS -> PA1
RESET -> PA2
CS -> PA3
CLK -> PA5
DATA -> PA7
питание к 3V3 и GND платы
Включил тактирование нужных пинов, настроил и включил SPI. Запускаю инициализацию дисплея, а он молчит... Возникло у меня 2 вопроса:
1. Нужно ли настраивать пины аппаратного SPI дополнительно? Или при включении SPI они инициализируются правильным образом?
2. Указал в настройке SPI_DataSize_16b и заталкиваю в порт на передачу двухбайтное число. Правильно ли это? Или по одному байту надо слать?
Ну и сам код. В прикрепленном архиве проект для CooCox.
Код: Выделить всё
#include <stm32f10x.h>
#include <stm32f10x_conf.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_spi.h>
#define RS_Hi (GPIOA->ODR |= GPIO_ODR_ODR1); // RS = 1
#define RS_Low (GPIOA->ODR &= ~GPIO_ODR_ODR1); // RS = 0
#define RESET_Hi (GPIOA->ODR |= GPIO_ODR_ODR2); // RESET = 1
#define RESET_Low (GPIOA->ODR &= ~GPIO_ODR_ODR2); // RESET = 0
#define CS_Hi (GPIOA->ODR |= GPIO_ODR_ODR3); // CS = 1
#define CS_Low (GPIOA->ODR &= ~GPIO_ODR_ODR3); // CS = 0
uint16_t LCD_Init_1[12] = {0xFDFD,0xFDFD,0xEF00,0xEE04,0x1B04,0xFEFE,0xFEFE,0xEF90,0x4A04,0x7F3F,
0xEE04,0x4306};
uint16_t LCD_Init_2[25] = {0xEF90,0x0983,0x0800,0x0BAF,0x0A00,0x0500,0x0600,0x0700,0xEF00,0xEE0C,
0xEF90,0x0080,0xEFB0,0x4902,0xEF00,0x7F01,0xE181,0xE202,0xE276,0xE183,0x8001,0xEF90,0x0504,0x0600,0x0700};
void delay_ms(uint32_t ms) {
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
nCount = (RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount != 0; nCount--);
}
void SPI_Send (uint16_t SPI_Data) {
while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,SPI_Data);
}
void LCD_CMD(uint16_t data) {
CS_Low;
RS_Hi;
SPI_Send(data);
CS_Hi;
}
void LCD_DATA(uint16_t data) {
CS_Low;
RS_Low;
SPI_Send(data);
CS_Hi;
}
void LCD_init(void) {
int i;
RESET_Low;
delay_ms(20);
RESET_Hi;
for (i=0;i<12;i++) {
LCD_CMD(LCD_Init_1[i]);
}
delay_ms(5);
for (i=0;i<25;i++) {
LCD_CMD(LCD_Init_2[i]);
}
}
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA , &GPIO_InitStructure);
SPI_I2S_DeInit(SPI1);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_TXE);
SPI_Cmd(SPI1, ENABLE);
LCD_init();
while (1) {
}
return 0;
}