【易開嵌入式】rt-thread+stm32f407+tf卡(spi接口),實現RL-FLASHFS文件系統移植

前文:【易開嵌入式】rt-thread+stm32f407+nandflash,實現RL-FLASHFS文件系統移植  

          【易開嵌入式】rt-thread+stm32f407,實現RL-TCPnet網絡協議棧 

版權聲明:本版面文章皆爲原創、或參考其他技術網站、博客後自己動手做實驗所得,轉載請註明出處。

鳴謝:感謝eric硬漢

商務合作:[email protected]

易開嵌入式工作室

 

        前面博文,針對rt-thread操作系統下,關於nandflash的文件系統和rl- tcpnet網絡協議棧的適配做了說明。本文主要針對同樣操作系統環境,使用spi接口的tf卡,說明如何適配rl-flashfs。

       首先看下RL-ARM官網的對memory card的驅動說明:

        可以看到,對於 spi接口的tf卡,只要實現上述函數接口即可。ok,針對開發板來進行驅動配置,首先配置spi驅動。

        在rtt工程配置裏,使能SPI2接口,並支持DMA操作。驅動如下: 


void tf_Card_Init(void)
{
    // if(SD_Ctrbus_Init == 0){
        SD_Ctrbus_Init = 1;
        __HAL_RCC_GPIOA_CLK_ENABLE();
        rt_pin_mode(TF_CS_PIN,PIN_MODE_OUTPUT);
        rt_pin_mode(TF_DET_PIN,PIN_MODE_INPUT);

        rt_hw_spi_device_attach("spi2", "tfCard", GPIOA, GPIO_PIN_0);

        struct rt_spi_configuration cfg;
        cfg.data_width = 8;
        cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;

        cfg.max_hz = 20*400*1000;  

        spi_dev_microsd = (struct rt_spi_device *)rt_device_find(TF_SPI_DEVICE_NAME);
        rt_spi_configure(spi_dev_microsd, &cfg);                 
    // }
}

rt_uint8_t tf_Card_Send(rt_uint8_t cmd)
{
    rt_uint8_t recb;
    if(spi_dev_microsd != NULL){
        rt_spi_transfer(spi_dev_microsd,&cmd,&recb,1);
    }

    return recb;
}

void tf_Card_SendBuf(rt_uint8_t *data,rt_uint32_t len)
{
    if(spi_dev_microsd != NULL){
        rt_spi_transfer(spi_dev_microsd,data,RT_NULL,len);
    }
}

void tf_Card_RecBuf(rt_uint8_t *data,rt_uint32_t len)
{
    if(spi_dev_microsd != NULL){
        rt_spi_transfer(spi_dev_microsd,RT_NULL,data,len);
    }
}

void tf_Card_BusSpeed(rt_uint32_t khz)
{
    if(spi_dev_microsd != NULL){
        struct rt_spi_configuration cfg;
        cfg.data_width = 8;
        cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;

        cfg.max_hz = 20*khz*1000;                       

        rt_spi_configure(spi_dev_microsd, &cfg);
    }
}

對接口進行適配:

static BOOL Init         (void);
static BOOL UnInit       (void);
static U8 Send           (U8 outb);
static BOOL SendBuf      (U8 *buf, U32 sz);
static BOOL RecBuf       (U8 *buf, U32 sz);
static BOOL BusSpeed     (U32 kbaud);
static BOOL SetSS        (U32 ss);
static U32  CheckMedia   (void);
/*-----------------------------------------------------------------------------
  NAND Device Driver Control Block
 *----------------------------------------------------------------------------*/
const SPI_DRV spi0_drv = {
  Init,
  UnInit,
  Send,
  SendBuf,
  RecBuf,
  BusSpeed,
  SetSS,
  CheckMedia
};



static BOOL Init (void) {
   
   tf_Card_Init();

   return __TRUE;
}


static BOOL UnInit (void) {

   return __TRUE;
}


static U8 Send(U8 outb){
   U8 recb;
   
   recb = tf_Card_Send(outb);

   return recb;
}


static BOOL SendBuf(U8 *buf, U32 sz)
{
   tf_Card_SendBuf(buf,sz);

   return __TRUE;
}

static BOOL RecBuf(U8 *buf, U32 sz)
{
   tf_Card_RecBuf(buf,sz);

   return __TRUE;
}

static BOOL BusSpeed(U32 kbaud)
{
   tf_Card_BusSpeed(kbaud);

   return __TRUE;
}

static BOOL SetSS(U32 ss)
{
   if(ss){
      rt_pin_write(TF_CS_PIN, PIN_HIGH);
   }
   else
   {
      rt_pin_write(TF_CS_PIN, PIN_LOW);
   }
   
   return __TRUE;
}

static U32 CheckMedia(void)
{
	U32 stat = 0;
	if(rt_pin_read(TF_DET_PIN) == PIN_LOW){
		stat |= M_INSERTED; 
	}else{
		stat |= M_PROTECTED;
	}

   return stat;
}

至此,移植完成。可以盡情適配spi方式來操作tf卡了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章