хочу подключить к STM32F4 DISCOVERY дисплей LCD NOKIA 5110
использую CooCoxв софт SPI подключение проходит (так я проверил строку инициализации дисплея)
для хардварного SPI сначала вызываю инициализацию SPI2
используемые ноги:
- PB13 CLK
- PB15 MOSI
- NSS и MISO не использую так как нужно только записывать данные и SPI2 всегда в режиме мастера
Код
// Инициализация SPI2
void SPI2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // включили SPI2
SPI_DeInit(SPI2); // сбрасываем настройки SPI2 на первоначальные
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // включили GPIOB
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); // SPI2_CLK
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); // SPI2_MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// сюда задание альтернативных функций 13 и 15 пина тоже переносил. результата нет
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); // SPI2_CLK
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); // SPI2_MOSI
// SPI2
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
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_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
}
частота камня 168 мгц поэтому взял максимальный делитель для SPI2 = 256
далее инициализирую GPIO для других линий дисплея
Код
// Инициализация LCD NOKIA 5110 c помощью SPI2
void lcd5110_init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
unsigned char y, x;
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // такт GPIOB, для софт SPI, для хард - делается при ините SPI2
// конфигурируем пины порта B как выход
// для soft spi
// GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// для хардварного SPI
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10 | GPIO_Pin_14;
// общие строки инициализации
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
далее работаю с дисплеем, этот код используется и в софт и хард работе SPI c дисплеем
Код
// Линии управления LCD в неактивное состояние
LCD_CS1; // CS=1
LCD_RST1; // RST=1
delay_ms(10); // пауза 0.2 сек.
// сброс дисплея
LCD_CS0; // CS=0
LCD_RST0; // RST=0
delay_ms(10); // пауза 0.2 сек.
LCD_RST1; // RST=1
LCD_CS1; // CS=1
delay_ms(10); // пауза 0.2 сек.
// последовательность инициализации дисплея
LCD_DC0; // передача команды
LCD_SendData(0x21);
LCD_SendData(0xC6);
LCD_SendData(0x06);
LCD_SendData(0x13);
LCD_SendData(0x20);
LCD_SendData(0x0C);
LCD_DC0; // передача команд
LCD_SendData(0x40);
LCD_SendData(0x80);
LCD_DC1; // передача данных
for (y=0;y<6;y++) for (x=0;x<84;x++) LCD_SendData(0x88);
LCD_DC0; // передача команд
LCD_SendData(0x0C);
}
и собственно, сама процедура передачи данных на дисплей
Код
void LCD_SendData(unsigned char data) {
// unsigned char i; // для программного SPI
LCD_CS0; // включаем выбор дисплея
// хардварный SPI
SPI_I2S_SendData(SPI2, data);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
/* // это реализация программного SPI работает!
// программный SPI
for(i=0;i<8;i++)
{
if (data & 0x80) LCD_MOSI1; else LCD_MOSI0;
data = data<<1;
LCD_SCK0;
LCD_SCK0;
LCD_SCK0;
LCD_SCK1;
LCD_SCK1;
LCD_SCK1;
}
*/
LCD_CS1;
}
процедуры вызываю из main()
Код
SPI2_Config(); // конфигурация SPI2
lcd5110_init(); // конфигурация LCD
почему не работает аппаратный SPI2?
Сообщение отредактировал ВитГо - Oct 21 2012, 06:23