针对MB85RS2M富士通FRAM的SPI驱动程序,关联其他SPI的FRAM

该文详细介绍了针对富士通MB85RS2M驱动器的SPI模拟和硬件实现,包括GPIO初始化、SPI读写字节函数、内存读写操作及设备ID读取。代码示例展示了如何进行SPI通信,如解锁、写使能、地址和数据传输等步骤,同时提到了硬件SPI的配置和时序注意事项。

针对富士通的MB85RS2M驱动程序

软件模拟SPI

首先是初始化GPIO引脚,因为是软件模拟,所以GPIO不做要求,任意引脚即可。

#define BSP_MB85RS2M
#include "bsp_mb85rs2m.h"
/*
MX_SPI1_Init
------------------
Des:SPI初始化
NOTE:
REF:
------------------
Author:zx
Date:2023年05月11日
*/
void MX_SPI1_Init(void)
{
   
   	  
    LL_GPIO_InitTypeDef GPIO_InitStruct = {
   
   0};	  
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
    /**SPI1 GPIO Configuration
    PA5   ------> SPI1_SCK
    PA6   ------> SPI1_MISO
    PA7   ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = LL_GPIO_PIN_5|LL_GPIO_PIN_7;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	  
    GPIO_InitStruct.Pin = LL_GPIO_PIN_4;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);		
		
    GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

编写SPI的读字节程序

/*
SpiReadByte
------------------
Des:SPI读字节函数
NOTE:
REF:
------------------
Author:zx
Date:2023年05月11日
*/
static uint8_t SpiReadByte(void)
{
   
   
    uint8_t u8Index, u8Rdata = 0;
    
    FM_CLR_CLK;
    for(u8Index=0; u8Index<8; u8Index++)
    {
   
   
        if(FM_STA_MISO)
        {
   
   
            u8Rdata |= 0x80 >> u8Index;
        }
        FM_SET_CLK;    		
        FM_CLR_CLK;
    }
    return u8Rdata;
}

编写SPI写字节函数

/*
SpiWriteByte
------------------
Des:SPI写字节函数
NOTE:
REF:
------------------
Author:zx
Date:2023年05月11日
*/
void SpiWriteByte(uint8_t u8Wdata)
{
   
   
    uint8_t u8Index;
    
    FM_CLR_CLK;
    for(u8Index = 0; u8Index < 8; u8Index++)
    {
   
   
        if(u8Wdata & (0x80 >> u8Index))
        {
   
   
            FM_SET_MOSI;
        }
        else
        {
   
   
            FM_CLR_MOSI;
        }
        FM_SET_CLK;
        FM_CLR_CLK;
    }
}

下面是读写内存的函数,是重点
写一条数据到FRAM指定地址

首先看FRAM的数据手册,数据手册上说需要先对WEL寄存器进行操作,在写数据之前,首先要发送写使能的命令;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,写数据前先要发送解锁命令后才能进行常规操作,在解锁之后发送写使能命令,然后发送要写入的地址和要写入的数据,所以程序如下:

/*
FM_Write_Datas
------------------
Des:Write memory data,在例程中时钟为18432000Hz条件下,写200字节的时间为6ms
NOTE:
REF:
------------------
Author:zx
Date:2023年05月11日
*/
uint8_t FM_Write_Datas(uint32_t u32Addr, uint8_t *pu8Buf, uint32_t u32PLen)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值