天天看點

STM32外設SPI讀寫TM1628查詢方式非模拟獨家貢獻

//寫數位管

uint8_t TM1628_WritePro(void)

{

  if(1!=TM1628_State)return 0;

  SPI1->CR1 |= SPI_Direction_1Line_Tx ;

  TM1628_State = 0 ;

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI_SendData8(SPI1,0x00);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);          

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI1->DR = 0x44; 

  SPI_SendData8(SPI1,0x44);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);              

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI_SendData8(SPI1,0xC0);

  SPI_SendData8(SPI1,ShowValue[0]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);         

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI_SendData8(SPI1,0xC2);

  SPI_SendData8(SPI1,ShowValue[1]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); 

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI_SendData8(SPI1,0xC4);

  SPI_SendData8(SPI1,ShowValue[2]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); 

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI_SendData8(SPI1,0xC6);

  SPI_SendData8(SPI1,ShowValue[3]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);              

  SetSTB;

  DelayXu(10);

  ClrSTB;

  SPI_SendData8(SPI1,0x89);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);              

  SetSTB; 

  return 0;

}

//讀按鍵

uint8_t TM1628_ReadPro(void)

{

  if(2!=TM1628_State) return 0;

   SPI1->CR1  |= SPI_Direction_1Line_Tx;//

   SetSTB;

   DelayXu(10);

   ClrSTB;

   SPI_SendData8(SPI1,0x42);

   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

   DelayXu(10);

   SPI1->CR1  &= ~SPI_EN;;//修改配置

   SPI1->CR1  &= 0xbfff;//修改配置

   SPI1->CR1  |= SPI_EN;;//修改配置

   while((SPI1->SR&SPI_I2S_FLAG_RXNE) == RESET);

   KeyTemp[0] = SPI_ReceiveData8(SPI1);

   while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

   KeyTemp[1] = SPI_ReceiveData8(SPI1);

   while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

   KeyTemp[2] = SPI_ReceiveData8(SPI1);

   while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

   KeyTemp[3] = SPI_ReceiveData8(SPI1);

   SPI1->CR1  |= SPI_Direction_1Line_Tx;//

   SetSTB;

   TM1628_State = 0;

   return 0;

}

//PB3 CLK

  GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_2MHz;

  GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP ;

  GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_UP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

    //PB5 MOSI

  GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_2MHz;

  GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType   = GPIO_OType_OD ;

  GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_UP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

     PB3->SPI1SCK    PB5->SPI1MOSI

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_5);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_5);

  //SPI設定

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);

  //SPI1 CR1控制

  SPI1->CR1  = (SPI_Direction_1Line_Tx|SPI_FirstBit_LSB |SPI_BaudRatePrescaler_256|SPI_MSTR|SPI_CPOL_High|SPI_CPHA_2Edge) |SPI_NSS_Soft|SPI_SSI_High ;//|

  // SPI1 CR2控制

  SPI1->CR2 = SPI_DataSize_8b|SPI_RxFIFOThreshold_QF;//|SPI_TXEIE|SPI_SSOE|SPI_NSSP 超過1/4 RXNE = 1

  SPI1->CR1 |=  SPI_EN;

繼續閱讀