| | |
| | | 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 |
| | | |
| | |
| | | __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(); |
| | |
| | | //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) |
| | |
| | | |
| | | 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]); |
| | |
| | | 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) |
| | | { |
| | |
| | | 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++) |
| | | { |
| | |
| | | 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) |
| | | { |
| | |
| | | |
| | | 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(); //?????? |
| | | } |
| | | /* |