forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-04-23 678cda82efa03c875db392b738943f30812f0d55
HARDWARE/SPI/SPI.c
@@ -1,134 +1,68 @@
/******************************************************************************
 * Copyright (C) 2014-2015 HangZhou SiZhu Co.,LTD.
 *
 *-----------------------------------------------------------------------------
 * File:              spi.c
 * Description:      spi gpio config , receive and send data code
 * Author:           Lishoujian (867693272@qq.com)
 * Date:             Jan 8, 2015
 *****************************************************************************/
/* ----------------------- Platform includes --------------------------------*/
#include "spi.h"
#include "stm32f10x.h"
#include "systaskinit.h"
#include "gpio.h"
/******************************************
 * func:    SPI3_ioconfig
 * desc:    config gpio;initialize hardware interface of spi3
 * input:   none
 * output:  none
 * return:  none
 *****************************************/
void Fram_Flash_SPI_Init(void)
void SPI3_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;      //CPOL low
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;   //CPOA first edge
   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;      //Baud Rate Prescaler is 256
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //send and receive data begin with high bit
   SPI_InitStructure.SPI_CRCPolynomial = 7;
   SPI_Init(Fram_Flash_SPI_NUM, &SPI_InitStructure);
   SPI_Cmd(Fram_Flash_SPI_NUM, ENABLE); //Enable SPI3
}
/******************************************
 * func:    SPI_ReadWriteByte
 * desc:    spi receive and send data
 * input:   SPIx - SPI port , TxData - send data
 * output:  none
 * return:  the data received by spi
 *****************************************/
u8 SPI_ReadWriteByte(SPI_TypeDef* SPIx,u8 TxData)
{
   u8 retry=0;
   while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET) //¼ì²éÖ¸¶¨µÄSPI±ê־λÉèÖÃÓë·ñ:·¢ËÍ»º´æ¿Õ±ê־λ
      {
      retry++;
      if(retry>200)return 0;
      }
   SPI_I2S_SendData(SPIx, TxData); //ͨ¹ýÍâÉèSPIx·¢ËÍÒ»¸öÊý¾Ý
   retry=0;
   while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET) //¼ì²éÖ¸¶¨µÄSPI±ê־λÉèÖÃÓë·ñ:½ÓÊÜ»º´æ·Ç¿Õ±ê־λ
      {
      retry++;
      if(retry>200)return 0;
      }
   return SPI_I2S_ReceiveData(SPIx); //·µ»ØÍ¨¹ýSPIx×î½ü½ÓÊÕµÄÊý¾Ý
}
u8 SPI1_ReadWriteByte(u8 TxData)
{
   u8 retry=0;
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //¼ì²éÖ¸¶¨µÄSPI±ê־λÉèÖÃÓë·ñ:·¢ËÍ»º´æ¿Õ±ê־λ
      {
      retry++;
      if(retry>200)return 0;
      }
   SPI_I2S_SendData(SPI1, TxData); //ͨ¹ýÍâÉèSPIx·¢ËÍÒ»¸öÊý¾Ý
   retry=0;
      CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
      
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //¼ì²éÖ¸¶¨µÄSPI±ê־λÉèÖÃÓë·ñ:½ÓÊÜ»º´æ·Ç¿Õ±ê־λ
      {
      retry++;
      if(retry>200)   return 0;
      }
//    AltFunIO(GPIOF, GPIO_Pin_15, ALTFUN_NORMAL);    // SSN
    AltFunIO(SPI3_PORT, SPI3_SCK_PIN, ALTFUN_NORMAL);    // SCK
    AltFunIO(SPI3_PORT, SPI3_MISO_PIN, ALTFUN_NORMAL);    // MISO
    AltFunIO(SPI3_PORT, SPI3_MOSI_PIN, ALTFUN_NORMAL);    // MOSI
   
   return SPI_I2S_ReceiveData(SPI1); //·µ»ØÍ¨¹ýSPIx×î½ü½ÓÊÕµÄÊý¾Ý
      CMU_PERCLK_SetableEx(SPI3CLK, ENABLE);   //¿ªÆôSPI3×ÜÏßʱÖÓ
      SPIx_CR1_IOSWAP_Set(SPI3, SPIx_CR1_IOSWAP_DEFAULT);  // MISO¡¢MOSIĬÈÏÒý½Å ²»½»»»
      SPIx_CR1_MM_Set(SPI3, SPIx_CR1_MM_MASTER);           //masterģʽ
      SPIx_CR1_WAIT_Set(SPI3, SPIx_CR1_WAIT_1WAIT);        // Ã¿·¢ËÍÍêÒ»Ö¡ºó²åÈëÒ»¸öCLK
      SPIx_CR1_BAUD_Set(SPI3, SPIx_CR1_BAUD_DIV4);         //²¨ÌØÂÊÉèÖÃΪÍâÉèʱÖÓ2·ÖƵ
      SPIx_CR1_LSBF_Set(SPI3, SPIx_CR1_LSBF_MSB);          //Ö¡¸ñʽÏÈ·¢ËÍMSB
      SPIx_CR1_CPHOL_Set(SPI3, SPIx_CR1_CPHOL_LOW);        //CLKÍ£Ö¹ÔÚµÍµçÆ½
      SPIx_CR1_CPHA_Set(SPI3, SPIx_CR1_CPHA_1CLOCK);       //µÚÒ»¸öʱÖÓ±ßÑØ²¶×½
      SPIx_CR2_SSNSEN_Setable(SPI3, DISABLE);                 //SSNÓÉÓ²¼þ¿ØÖÆ
      SPIx_CR2_RXO_Setable(SPI3, DISABLE);                 //SPIÉèÖÃΪȫ˫¹¤
      SPIx_CR2_DLEN_Set(SPI3, SPIx_CR2_DLEN_8BIT);         //ͨÐÅÊý¾Ý×Ö³¤8bit
      SPIx_CR2_HALFDUPLEX_Set(SPI3, SPIx_CR2_HALFDUPLEX_SPI); //SPIÉèÖÃΪ±ê×¼SPIģʽ
      SPIx_CR2_SSNM_Set(SPI3, SPIx_CR2_SSNM_LOW);             //ÿ´Î·¢Íêmasterºóssn±£³ÖµÍ
      SPIx_CR2_TXO_AC_Setable(SPI3, DISABLE);                 //¹Ø±ÕTXONLY×Ô¶¯Çå0
      SPIx_CR2_TXO_Setable(SPI3, DISABLE);                    //¹Ø±ÕTXONLYģʽ
   //   SPIx_CR2_SSN_Set(SPI3, SPIx_CR2_SSN_HIGH);               //SSNSENΪ£±Ê±SNNÊä³ö¸ßµçƽ
      SPIx_CR3_SERRC_Clr(SPI3);             //Çå³ý´Ó»ú´íÎó±êÖ¾
      SPIx_CR3_MERRC_Clr(SPI3);             //Çå³ýÖ÷»ú´íÎó±êÖ¾
      SPIx_CR3_RXBFC_Clr(SPI3);             //Çå³ýRXBUF
      SPIx_CR3_TXBFC_Clr(SPI3);             //Çå³ýTXBUF
    SPIx_CR2_SPIEN_Setable(SPI3, ENABLE);          //ʹÄÜSPI3
}
u8 SPI3_ReadWriteByte(u8 TxData)
{
   uint8 retry=0;
   while (SPI_I2S_GetFlagStatus( SPI3, SPI_I2S_FLAG_TXE) == RESET) //send buffer  empty flag
      {
      retry++;
      if(retry>200)return 0;
      }
   SPI_I2S_SendData(SPI3, TxData); //send data
   retry=0;
   while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET) //receive buffer not empty flag
      {
      retry++;
      if(retry>200)return 0;
      }
   return SPI_I2S_ReceiveData(SPI3); //return received data
uint8_t SpiWriteAndRead(uint32_t data)
{
    SPIx_TXBUF_Write(SPI3, data);
    while (!SPIx_ISR_TXBE_Chk(SPI3));
    while (!SPIx_ISR_RXBF_Chk(SPI3));
    data = SPIx_RXBUF_Read(SPI3);
    return data;
}
void SpiWrite(uint8_t *data, uint32_t length)
{
    while (length--)
    {
        SpiWriteAndRead(*data);
        data++;
    }
}
u8 SPI2_ReadWriteByte(u8 TxData)
{
   uint8 retry=0;
   while (SPI_I2S_GetFlagStatus( SPI2, SPI_I2S_FLAG_TXE) == RESET) //send buffer not empty flag
      {
      retry++;
      if(retry>200)return 0;
      }
   SPI_I2S_SendData(SPI2, TxData); //send data
   retry=0;
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //receive buffer not empty flag
      {
      retry++;
      if(retry>255)return 0;
      }
   return SPI_I2S_ReceiveData(SPI2); //return reveived data
void SpiRead(uint8_t *data, uint32_t length)
{
    while (length--)
    {
        *data = SpiWriteAndRead(0x00);
        data++;
    }
}