QuakeGod
2024-11-25 9aed5d7e7b3c7bf09da712e9c272ece401a7acc9
ComLib/Src/functions.c
@@ -519,12 +519,12 @@
   else {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_15);}   
}
#else
void ToggleOutStat() {   LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_11);}
void ToggleOutStat() {   } //LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_11);}
void SetOutStat(uchar bOn)
{
   if (bOn) {LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11);}
   else {LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);}
//   if (bOn) {LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11);}
//   else {LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);}
}
#endif
@@ -899,27 +899,15 @@
   __disable_irq();
   STRCLK2_1();   
   LL_SPI_TransmitData8(SPI2,Y>>8);
   int i=0;
   while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)
   {
   }
   KMem.SDD[28]=i;
   i=0;
   while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)
   {
      i++;
   }
   while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)   {   }
   while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)   {   }
   LL_SPI_TransmitData8(SPI2,Y);
   while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)
   {
   }
   KMem.SDD[28]=i;
   i=0;
   while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)
   {
      i++;
   }
   KMem.SDD[30]=i;
   while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)   {   }
   while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)   {   }
      STRCLK2_0();
      STRCLK2_1();
   __enable_irq();
@@ -1016,83 +1004,144 @@
//W25Q16 ID  0XEF14
//W25Q32 ID  0XEF15
//W25Q32 ID  0XEF16
#define W25Q80 0XEF13
#define W25Q16 0XEF14
#define W25Q32 0XEF15
#define W25Q64 0XEF16
#define W25Q80    0XEF13
#define W25Q16    0XEF14
#define W25Q32    0XEF15
#define W25Q64    0XEF16
#define W25Q128 0xEF17
//?????
#define SPI_FLASH_CS    PAout[15]  //??FLASH,???????PB12?
#define SPI_CS_EN    LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_15)
#define SPI_CS_NA      LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_15)
#define SPI1_FLASH_CS    PAout[15]  //??FLASH,???????PB12?
#define SPI1_CS_EN       LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_15)
#define SPI1_CS_NA      LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_15)
uint8_t SPI_Tranceive8(uint16_t Y)
uint8_t SPI_Tranceive8(SPI_TypeDef * SPIx, uint8_t Y)
{
   int i=0;
   while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET){ DelayUs(1);i++;   if (i>320) break;   }
   LL_SPI_TransmitData8(SPI2,Y>>8);
   while (LL_SPI_IsActiveFlag_TXE(SPIx) == RESET){ DelayUs(1);i++;   if (i>3200) break;   }
   LL_SPI_TransmitData8(SPIx,Y);
   i=0;
   while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)   {      DelayUs(1);i++;   if (i>320) break;}
   while (LL_SPI_IsActiveFlag_BSY(SPIx) == SET)   {      DelayUs(1);i++;   if (i>3200) break;}
   i=0;
   while (LL_SPI_IsActiveFlag_RXNE(SPI2) == RESET)   {      DelayUs(1);i++;   if (i>320) break;}
   Y = LL_SPI_ReceiveData8(SPI2);
   while (LL_SPI_IsActiveFlag_RXNE(SPIx) == RESET)   {      DelayUs(1);i++;   if (i>3200) break;}
   Y = LL_SPI_ReceiveData8(SPIx);
   return Y;
}
uint8_t SPI_Transmit(uint8_t * tData, uint8_t nLen, uint8_t timeout)
uint8_t SPI_Transmit(SPI_TypeDef * SPIx, uint8_t * tData, uint8_t nLen, uint8_t timeout)
{
   int nToSend=nLen;
   while(nLen > 0)
   {
      if (LL_SPI_IsActiveFlag_TXE(SPI1) && nToSend>0) {
         LL_SPI_TransmitData8(SPI1,*tData++); nToSend--;
      }
      if (LL_SPI_IsActiveFlag_RXNE(SPI1)) {
         LL_SPI_ReceiveData8(SPI1);
         nLen--;
      }
   }
   return 0;
   for (int i=0;i<nLen;i++)   {
      SPI_Tranceive8(tData[i]);
      SPI_Tranceive8(SPIx, tData[i]);
   }
   return 0;
}
uint8_t SPI_TransmitReceive(uint8_t * tData, uint8_t * rData, uint8_t nLen, uint8_t timeout)
uint8_t SPI_TransmitReceive(SPI_TypeDef * SPIx, uint8_t * tData, uint8_t * rData, uint8_t nLen, uint8_t timeout)
{
   for (int i=0;i<nLen;i++)   {
      rData[i] = SPI_Tranceive8(tData[i]);
   //      rData[i] = SPI_Tranceive8(SPIx, tData[i]);
   __IO uint32_t  * pSR = &(SPI1->SR);
      int j=0;
      while ((* pSR & SPI_SR_TXE) == RESET){    }
      LL_SPI_TransmitData8(SPIx,tData[i]);
      j=0;
   //   while (LL_SPI_IsActiveFlag_BSY(SPIx) == SET)   {      DelayUs(1);j++;   if (j>3200) break;}
   //   i=0;
      while (LL_SPI_IsActiveFlag_RXNE(SPIx) == RESET)   {      }
      rData[i] = LL_SPI_ReceiveData8(SPIx);
   }
   return 0;
}
uint8_t SPI1_Tranceive(uint8_t * tData, uint8_t * rData, uint8_t nLen)
{
   register int nToSend=nLen;
// /*
   __IO uint32_t  * pSR = &(SPI1->SR);
   __IO uint8_t  * pDR = (__IO uint8_t *)&(SPI1->DR);
   __disable_irq();
   while(nLen >0)
   {
      if (*pSR & SPI_SR_TXE && nToSend>0) {
         LL_SPI_TransmitData8(SPI1,*tData++); nToSend--;
      }
      if (*pSR & SPI_SR_RXNE) {
         *rData++ = * pDR;
         nLen--;  // if (nLen == 0) break;
      }
   }
// */
 /*
   while(nLen > 0)
   {
      if (LL_SPI_IsActiveFlag_TXE(SPI1) && nToSend>0) {
         LL_SPI_TransmitData8(SPI1,*tData++); nToSend--;
      }
      if (LL_SPI_IsActiveFlag_RXNE(SPI1)) {
         *rData++ = LL_SPI_ReceiveData8(SPI1);
         nLen--;  // if (nLen == 0) break;
      }
   }
// */
   __enable_irq();
   return nLen;
}
uint8_t SPI_Flash_ReadSR(void)
uint8_t SPI1_Flash_ReadSR(void)
{  
uint8_t Data1[2]= {W25X_ReadStatusReg,0x00};
uint8_t Rxdata[2];   
uint8_t byte=0;   
         SPI_CS_EN;
         SPI_TransmitReceive(Data1,Rxdata,2,100);
         SPI_CS_NA;
         SPI1_CS_EN;
         SPI1_Tranceive(Data1,Rxdata,2);
         SPI1_CS_NA;
         byte=Rxdata[1];
return byte;   
void SPI_Flash_Wait_Busy(void)   
{   
 while((SPI_Flash_ReadSR()&0x01)==0x01);   // ??BUSY???
 while((SPI1_Flash_ReadSR()&0x01)==0x01);   // ??BUSY???
}  
void SPI_FLASH_Write_SR(uint8_t sr)   
{   
uint8_t Data1[2]= {W25X_ReadStatusReg,0x00};
         Data1[1]=sr;
         SPI_CS_EN;
         SPI_Transmit(Data1,2,100);
         SPI_CS_NA;
         SPI1_CS_EN;
         SPI_Transmit(SPI1, Data1, 2,100);
         SPI1_CS_NA;
 }    
uint16_t SPI_Flash_ReadID(void)
{
   uint16_t Temp = 0;  
   uint8_t Data1[4] = {W25X_ManufactDeviceID,0x00,0x00,0x00};
   uint8_t Data2[2]= {0x00,0x00};
   uint8_t Rxdata[2];
         SPI_CS_EN;
         SPI_Transmit(Data1,4,100);
         SPI_TransmitReceive(Data2,Rxdata,2,100);
         SPI_CS_NA;
   Temp=(Rxdata[0]<<8)|Rxdata[1];
   uint8_t Data1[6] = {W25X_ManufactDeviceID,0x00,0x00,0x00,0x00,0x00};
   uint8_t Data2[6]= {0x00,0x00};
//   uint8_t Rxdata[2];
         SPI1_CS_EN;
         //SPI_Transmit(SPI1, Data1,4,100);
         // SPI_TransmitReceive(SPI1,Data1,Data2,6,100);
         SPI1_Tranceive(Data1,Data2,6);
         SPI1_CS_NA;
   Temp=(Data2[4]<<8)|Data2[5];
return Temp;
}       
uint64_t SPI_Flash_ReadUID(uint8_t * Uid)
@@ -1106,10 +1155,10 @@
 
   uint8_t Data1[5] = {W25X_ReadUniqueID,0x00,0x00,0x00,0x00};
   uint8_t Data2[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
   SPI_CS_EN;
   SPI_Transmit(Data1,5,100);
   SPI_TransmitReceive(Data2,uids.Rxdata,8,100);
   SPI_CS_NA;
   SPI1_CS_EN;
   SPI_Transmit(SPI1, Data1,5,100);
   SPI_TransmitReceive(SPI1, Data2,uids.Rxdata,8,100);
   SPI1_CS_NA;
   memcpy(Uid,uids.Rxdata,8);
   uint32_t t1 = __rev(uids.temp2[0]);
   uids.temp2[0]= __rev(uids.temp2[1]);
@@ -1120,17 +1169,17 @@
void SPI_FLASH_Write_Enable(void)   
{
   uint8_t Txdata[2]={W25X_WriteEnable};   
   SPI_CS_EN;
   SPI_Transmit(Txdata,1,100);
   SPI_CS_NA;
   SPI1_CS_EN;
   SPI1_Tranceive(Txdata,Txdata,1);
   SPI1_CS_NA;
void SPI_FLASH_Write_Disable(void)   
{  
   uint8_t Txdata[2]={W25X_WriteDisable};   
   SPI_CS_EN;
   SPI_Transmit(Txdata,1,100);
   SPI_CS_NA;
   SPI1_CS_EN;
   SPI_Transmit(SPI1, Txdata,1,100);
   SPI1_CS_NA;
}       
void W25QXX_Erase_Sector(uint32_t Dst_Addr)   
{  
@@ -1144,26 +1193,26 @@
  SPI_FLASH_Write_Enable();                   //SET WEL  ,???
      SPI_Flash_Wait_Busy();     
   
   SPI_CS_EN;
   SPI_Transmit(Data1,4,100);
   SPI_CS_NA;
   SPI1_CS_EN;
   SPI1_Tranceive(Data1,Data1,4);
   SPI1_CS_NA;
      SPI_Flash_Wait_Busy();     //??????   
 }  
void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
  uint16_t i; 
   uint8_t Data1[4] = {W25X_ReadData,0x00,0x00,0x00};
   uint8_t Data2[16]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
//   uint8_t Data2[16]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
   
   Data1[1]=ReadAddr>>16;
   Data1[2]=ReadAddr>>8;
   Data1[3]=ReadAddr;
   
   SPI_CS_EN;
   SPI_Transmit(Data1,4,100);
   SPI1_CS_EN;
   SPI_Transmit(SPI1, Data1,4,100);
//   HAL_SPI_TransmitReceive(&hspi1,pBuffer,pBuffer,NumByteToRead,10);
//      HAL_SPI_TransmitReceive_DMA(&hspi1,pBuffer,pBuffer,NumByteToRead);
   SPI_TransmitReceive(pBuffer,pBuffer,NumByteToRead,100);
   SPI1_Tranceive(pBuffer,pBuffer,NumByteToRead);
/*   
   for(i=0;i<NumByteToRead/16;i++)
      { 
@@ -1174,7 +1223,7 @@
            HAL_SPI_TransmitReceive(&hspi1,Data2,pBuffer+i*16,NumByteToRead%16,100);         
      }
   */
   SPI_CS_NA;
   SPI1_CS_NA;
}  
void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
@@ -1186,10 +1235,10 @@
   
   SPI_FLASH_Write_Enable();                   //SET WEL  ,???
   SPI_Flash_Wait_Busy();     
   SPI_CS_EN;
   SPI_Transmit(Data1,4,100);
   SPI_Transmit(pBuffer,NumByteToWrite,100);
   SPI_CS_NA;
   SPI1_CS_EN;
   SPI_Transmit(SPI1, Data1,4,100);
   SPI_Transmit(SPI1, pBuffer,NumByteToWrite,100);
   SPI1_CS_NA;
   SPI_Flash_Wait_Busy();     //??????      
/*