本人使用的是stm32f207的100管脚芯片,使用SPI1连接华远公司的液晶UC1698u,代码如下:
SPI1的初始化
[mw_shl_code=c,true]void stm32_SPISetup (void)
{
/*---------SPI1----------------*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
RCC->APB2RSTR |= RCC_APB2RSTR_SPI1; // 复位外设为默认值
RCC->APB2RSTR &= ~RCC_APB2RSTR_SPI1; // 复位外设为默认值
SPI1->CR1 = 0x033f; //时钟为60M/64,模式3,先传高位,使内部NSS管脚为高电平,SCK空闲为高
SPI1->SR = 0; //清中断标志
SPI1->CR2 = 0x0000; //禁止发送接收中断
SPI1->CR1 |=SPI_Device_En; //使能设备
// NVIC->ISER[SPI1_IRQn >> 0x05] =(u32)0x01 << (SPI1_IRQn & (uint8_t)0x1F); // Enable the Selected IRQ Channels
}[/mw_shl_code]
管脚初始化(SPI1管脚在其他地方已经设置为复用,这里就不复述),使用PE2作为液晶复位脚。PE3作为液晶的数据/命令功能脚,PE4为液晶片选脚,PE5为液晶背光
[mw_shl_code=c,true]static unsigned char UC1698IOConfigure_FUN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOs clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE| RCC_AHB1Periph_GPIOB , ENABLE);
/* Configure GPIOE */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOE, &GPIO_InitStructure);
return UC1698_SUCCESS;
}[/mw_shl_code]
所需要考虑的管脚为:
操作函数为:
[mw_shl_code=c,true]unsigned char UC1698WriteOneByteToLCD_FUN(unsigned char cDataType,unsigned char cData)
{
UC1698_XCS_CLEAR; //片选UC1698
// os_dly_wait(1);
UC1698_nop_FUN(10);
if(cDataType==UC1698_COMMAND_TYPE) //表明操作的是命令
{
UC1698_A0_CLEAR; //写命令
SPI_I2S_SendData(SPI1,cData);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);
UC1698_nop_FUN(10); //延时
UC1698_A0_SET; //命令发完后恢复到数据发送状态
}
else if(cDataType==UC1698_DATA_TYPE) //表明操作的是数据
{
UC1698_A0_SET;
SPI_I2S_SendData(SPI1,cData);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);
}
UC1698_nop_FUN(10); //延时
UC1698_XCS_SET; //取消片选UC1698
return UC1698_SUCCESS;
}[/mw_shl_code]
但是发现,检测后,SPI输出的波形是正确的,但是液晶无显示,请问有做过这方面的人吗?搞了两三天了,一直没有结果 |