#include "stm32f4xx.h"
#include "Mc_stm32f4_fm25h20.h"
static void Write_Byte(rt_uint8_t SByte)
{
rt_uint8_t i,btemp;
btemp = SByte;
for(i=0; i<8; i++)
{
SPI2_SCK_L;
if(btemp & 0x80)
SPI2_MOSI_H;
else
SPI2_MOSI_L;
btemp<<=1;
SPI2_SCK_H;
}
}
static rt_uint8_t Read_Byte(void)
{
rt_uint8_t i,btemp;
btemp = 0x00;
for(i=0; i<8; i++)
{
btemp<<=1;
SPI2_SCK_L;
__nop();
SPI2_SCK_H;
btemp |= SPI2_MISO;
}
return btemp;
}
/*
功能:
- 初始化FM控制接口,IO模拟SPI
-
*/
void FM25_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(FM_SPI_PORT_CLK | RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Pin = SPI2_MOSI_PIN;
GPIO_Init(FM_SPI_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = FM_CS1_PIN;
GPIO_Init(FM_SPI_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Pin = SPI2_SCK_PIN;
GPIO_Init(FM_SPI_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Pin = SPI2_MISO_PIN;
GPIO_Init(FM_SPI_PORT, &GPIO_InitStructure);
FM_CS1_H; //片选置高
SPI2_SCK_L; //时钟置低
SPI2_MOSI_H; //数据置高
}
/*
功能:
- 从FM25H20批量读取数据
参数:
- address:FM25H20的地址,pdata:读出数据的存储指针,length:读出数据的长度
*/
void FM25_read(rt_uint32_t address, rt_uint8_t* pdata, rt_uint32_t length)
{
rt_uint8_t* padr;
unsigned long temp_adr,temp_len,i;
temp_adr = address;
temp_len = length;
if(temp_adr >= FM_SIZE)
temp_adr = temp_adr%FM_SIZE;
padr=(rt_uint8_t*)&temp_adr;
FM_CS1_L; //片选使能
Write_Byte(CMD_READ); //读指令
Write_Byte(padr[2]); //读地址高两位
Write_Byte(padr[1]); //读地址中间字节
Write_Byte(padr[0]); //读地址低字节
/*读出数据*/
for(i=0;i<temp_len;i++)
pdata[i]=Read_Byte();
FM_CS1_H; //片选禁止
}
/*
功能:
- 从FM25H20批量:写入数据
参数:
- address:FM25H20的地址,pdata:写入数据的存储指针,length:写入数据的长度
*/
void FM25_write(rt_uint32_t address, rt_uint8_t* pdata, rt_uint32_t length)
{
rt_uint8_t* padr;
rt_uint32_t temp_adr,temp_len,i;
temp_adr = address;
temp_len = length;
if(temp_adr >= FM_SIZE)
temp_adr = temp_adr%FM_SIZE;
padr=(rt_uint8_t*)&temp_adr;
FM_CS1_L; //片选使能,写使能
Write_Byte(CMD_WREN); //写使能
FM_CS1_H;
FM_CS1_L;
Write_Byte(CMD_WRITE); //写指令
Write_Byte(padr[2]); //写地址高两位
Write_Byte(padr[1]); //写地址中间字节
Write_Byte(padr[0]); //写地址低字节
/*写入数据*/
for(i=0;i<temp_len;i++)
Write_Byte(pdata[i]);
FM_CS1_H; //片选禁止写保护
}
FM25H20驱动程序
4星 · 超过85%的资源 需积分: 13 76 浏览量
2014-02-11
22:01:00
上传
评论
收藏 2KB RAR 举报
zhuyiwu
- 粉丝: 0
- 资源: 2
最新资源
- windows下NTFS文件系统读取.zip
- windows程序设计课程 相关代码.zip
- Windows via C++图书代码,升级Windows SDK 到10.zip
- matlab基于扩张卡尔曼滤波的磷酸铁锂蓄电池SOC检测,给出了电池模型和算法实现过程.zip
- matlab基于卡尔曼滤波的磷酸铁锂蓄电池SOC检测
- STM8S003F3P6最小系统AD版(包含原理图、PCB源文件)
- smg.uvproj
- nextjs turbo build
- mysql-connector-j-8.0.31.jar
- MATLAB Appdesigner 设计天气预报小程序:全国各城市天气查询系统Weather-capturer-v3
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论5