前文:【易開嵌入式】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卡了