首页应用案例 › STM32F103C8T6单片机最小开发板控制RA8889软件说明

STM32F103C8T6单片机最小开发板控制RA8889软件说明

2023-05-17

上节介绍了STM32F103C8T6最小开发板连接RA8889这块开发板的硬件连接,接下来介绍一下软件部份。

RA8889开发板中,单片机与其是有连接的,故我们需要先在其上面跑一下初始化,将连接的引脚设定为浮空状态,PE7~10做一下初始化设定。


**
void GPIO_Configuration_Ex_SPI(void) //外接SPI配置DB47/PE710为悬空状态

{

GPIO_InitTypeDef GPIO_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

}

 

开发板上的MCU是STM32F103VET6 或者兼容,做一下基本初始化即可:
**
/* System Clocks Configuration */

RCC_Configuration(); 

delay_init(72);  

GPIO_Configuration();

NVIC_Configuration();

/* Enable the FSMC Clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

delay_ms(1);

 

RA8889_HW_Reset(); //RA8889硬件复位

GPIO_Configuration_Ex_SPI(); //使用外部SPI 4线配置,悬空状态

while(1);

这样做好之后,开发板的硬件只要按要求接好PS0~2的高低电平,就可以通过外部的单片机控制板上的RA8889了。

RA8889核心文件先移植进来,

配置好STM32F103C8T6的GPIO:

GPIO_Configuration();

**
void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13; //推挽輸出:LED1 -> PC13

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

  GPIO_Init(GPIOC, &GPIO_InitStructure);

 

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8; //RA8889_RESET:PA8

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_15; //推挽輸出: NSS,MOSI,SCK

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13; //输入悬空:MISO

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

}

对SPI进行初始化:SPI4_Init();

需要检查RA8889_MCU_IF.c的代码,有可能需要作相应要变定义。

在这里要强调一点,请确保每个函数都有效,通信才可能正常。若有个别函数编译后过不去,那么需要检查。

**
#ifdef Serial_4

 

void SPI4_Delay(void)

{

  unsigned char t;

  t=Serial_t;

  while(t!=0)

  {

    t--;

  }

}

 

void SPI4_Init(void)

{

Set_SPI4_ZCS;   //  GPIO_SetBits(GPIOE, GPIO_Pin_7);

Set_SPI4_SDO;   //  GPIO_SetBits(GPIOE, GPIO_Pin_8);

Set_SPI4_SDA; //  GPIO_SetBits(GPIOE, GPIO_Pin_9);

Set_SPI4_SCL;   //  GPIO_SetBits(GPIOE, GPIO_Pin_10);

}

 

 

///******************************************************************************

//SPI_Write()

//******************************************************************************/

void SPI4_Write(unsigned char dat)

{

  unsigned char t = 8;

 

Set_SPI4_SDO; //GPIO_SetBits(GPIOE, GPIO_Pin_8);

do

{

  if  ((dat & 0x80)==0x80) 

{

    Set_SPI4_SDA;//  GPIO_SetBits(GPIOE, GPIO_Pin_9);

}

else

  {

  Reset_SPI4_SDA;//GPIO_ResetBits(GPIOE, GPIO_Pin_9);

}

dat <<= 1;

Reset_SPI4_SCL;//GPIO_ResetBits(GPIOE, GPIO_Pin_10);

SPI4_Delay();

Set_SPI4_SCL;//GPIO_SetBits(GPIOE, GPIO_Pin_10);

SPI4_Delay();

 

  } while ( --t != 0 );

 

Set_SPI4_SCL;//GPIO_SetBits(GPIOE, GPIO_Pin_10);

Set_SPI4_SDA;//GPIO_SetBits(GPIOE, GPIO_Pin_9);

}

 

///******************************************************************************

//SPI_Read()

//******************************************************************************/

unsigned char SPI4_Read(void)

{

  unsigned char dat=0;

  unsigned char temp=0;

  unsigned char t = 8;

 

do

{    

Reset_SPI4_SCL;//GPIO_ResetBits(GPIOE, GPIO_Pin_10);

    SPI4_Delay();

dat <<= 1;

temp=Read_SPI4_SDO;//temp=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8);

if ( temp==0x01 ) 

{

  dat++;

}

  Set_SPI4_SCL;//GPIO_SetBits(GPIOE, GPIO_Pin_10);

    SPI4_Delay();

} while ( --t != 0 );

   

return dat;

}

 

 

void LCD_DataWrite(unsigned char Data)

{

Reset_SPI4_ZCS;//GPIO_ResetBits(GPIOE, GPIO_Pin_7);

Set_SPI4_SDO;//GPIO_SetBits(GPIOE, GPIO_Pin_8);

Set_SPI4_SDA;//GPIO_SetBits(GPIOE, GPIO_Pin_9);

Set_SPI4_SCL;//GPIO_SetBits(GPIOE, GPIO_Pin_10);

SPI4_Write(0x80); 

SPI4_Write(Data);

SPI4_Delay();

Set_SPI4_ZCS;//GPIO_SetBits(GPIOE, GPIO_Pin_7);

  SPI4_Delay();

}

 

 

unsigned char LCD_DataRead(void)

{

  unsigned char Data;

GPIO_InitTypeDef GPIO_InitStructure;

 

  Set_SPI4_SDO;//  GPIO_SetBits(GPIOE, GPIO_Pin_8);

  Set_SPI4_SDA;// GPIO_SetBits(GPIOE, GPIO_Pin_9);

  Set_SPI4_SCL;//  GPIO_SetBits(GPIOE, GPIO_Pin_10);

Reset_SPI4_ZCS;// GPIO_ResetBits(GPIOE, GPIO_Pin_7);

 

SPI4_Write(0xc0);  

 

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //块腶

GPIO_Init(GPIOE, &GPIO_InitStructure);

 

Data = SPI4_Read();

 

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOE, &GPIO_InitStructure);

 

SPI4_Delay();

Set_SPI4_ZCS;//GPIO_SetBits(GPIOE, GPIO_Pin_7);

return Data;



 

 

unsigned char LCD_StatusRead(void)

{

unsigned char Data;

 

GPIO_InitTypeDef GPIO_InitStructure;

 

Set_SPI4_SDO;//  GPIO_SetBits(GPIOE, GPIO_Pin_8);

  Set_SPI4_SDA;// GPIO_SetBits(GPIOE, GPIO_Pin_9);

Set_SPI4_SCL;//    GPIO_SetBits(GPIOE, GPIO_Pin_10);

Reset_SPI4_ZCS;// GPIO_ResetBits(GPIOE, GPIO_Pin_7);

SPI4_Delay();

SPI4_Write(0x40); 

 

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //块腶

GPIO_Init(GPIOE, &GPIO_InitStructure);

 

Data = SPI4_Read();

 

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOE, &GPIO_InitStructure);

SPI4_Delay();

Set_SPI4_ZCS;// GPIO_ResetBits(GPIOE, GPIO_Pin_7);

return Data;

}

 

void LCD_CmdWrite(unsigned char cmd)

{

  Set_SPI4_SDO;// GPIO_SetBits(GPIOE, GPIO_Pin_8);

  Set_SPI4_SDA;// GPIO_SetBits(GPIOE, GPIO_Pin_9);

  Set_SPI4_SCL;// GPIO_SetBits(GPIOE, GPIO_Pin_10);

Reset_SPI4_ZCS;//GPIO_ResetBits(GPIOE, GPIO_Pin_7);

SPI4_Delay();

SPI4_Write(0x00); 

SPI4_Write(cmd);

SPI4_Delay();

Set_SPI4_ZCS;//GPIO_SetBits(GPIOE, GPIO_Pin_7);

SPI4_Delay();

}

  

#endif

接下来 对RA8889进行初始化,RA8889_Initial(); 这部份在此不详细展开,请参考官方资料说明文档。

做完之后就可以 执行演示代码,在API_Demo();里面,查看各种显示效果了!

下载链接:请见附件。提取码均为 STM-SPI

 

				分享到:

Downloads