大家好。请问谁有用过fresscale单片机的SPI模块外接SPI系列的铁电存储器FRAM(FM25040A).
硬件上的连接。是接单片机的SPI模块。
PTE4(ss) 接 25040的/SS
PTE5(MISO) 接 25040的so
PTE6(MOSI) 接 25040的si
PTE7(SCK) 接 25040的sck
PTE8 (VSS)接 25040的vss
25040的/hold(保持管脚),/wp(写保护管脚),VDD都接到5V上。
我的程序想实现往FM25040A写数据,然后读数据。可是好像写不到数据那样,数据寄存器读不到任何数据。
请大家帮帮忙找找原因。感激不尽。
#include "Cpu.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"
//fm25040的指令
#define WREN 0X06 //写允许指令
#define WRDI 0X04 //禁止写指令
#define RDSR 0x05 //写状态寄存器指令
#define WRSR 0X01 //读状态寄存器指令
#define READ 0x03 //写地址指令
#define WRITE 0X02 //读地址指令
#define maxaddr 0x0fff
#define minaddr 0
#define cs_low()
(PTED_PTED4=0) //片选
#define cs_high() (PTED_PTED4=1)
unsigned char i=0;
unsigned char rebuff1;
unsigned int k,d;
//==============================================================
//函数名:Init_SPI
//作者:KLY
//日期:2007-11-8 10:34
//功能:初始化SPI,波特率62.5KHZ//05,设置模式0,使能SPI (CPOL, CPHA=0,0)
//输入参数:无 250k//03
//返回值:无
//修改记录:无
//===============================================================
void SPI2_Init(void)
{
/* SPI1C1:
SPIE=0,SPE=1,SPTIE=0,MSTR=1,CPOL=0,CPHA=0,SSOE=0,LSBFE=0 */
setReg8(SPI1C1,
0x50);
/* SPI1C2:
??=0,??=0,??=0,MODFEN=0,BIDIROE=0,??=0,SPISWAI=0,SPC0=0 */
setReg8(SPI1C2, 0x00);
//双向模式
/* SPI1BR:
??=0,SPPR2=0,SPPR1=0,SPPR0=0,??=0,SPR2=1,SPR1=0,SPR0=1 */
setReg8(SPI1BR, 0x03);
PTED_PTED4=0; //初始值
PTEDD_PTEDD4=1;//设置为输出(片选管脚)
PTEPE_PTEPE4=1;//上拉
}
/***************************延时函数*******************************/
void delay(unsigned char t) {
unsigned char i,j;
for(i=0;i<t;i++){
for(j=0;j<10;j++);
}
}
/***********************写允许函数**********************************/
void WriteEN(void)
{
cs_low();
SPI1D=WREN; //25040写允许指令
while(!SPI1S_SPTEF);
cs_high();
}
/************************写数据函数*******************************/
void WRITEDATA(unsigned int ADR,unsigned char DATA1)
{
WriteEN();
//写允许函数
cs_low();
//当SPTEF=1时,发送缓冲器为空,向数据寄存器写入一个字节
// SPI1D=0X06; // FM25040A 允许写地址指令
//while(!SPI1S_SPTEF);
//当 SPTEF=0时,发送缓冲器不为空,判断是否发送完
SPI1D=WRITE; //开始通讯 写允许
while(!SPI1S_SPTEF);
SPI1D=((unsigned char)(ADR>>
8));//0;//发送写高8位地址
while(!SPI1S_SPTEF);
SPI1D=((unsigned char)(ADR));//0;//发送写低8位地址
while(!SPI1S_SPTEF);
SPI1D=DATA1; //写高8位数据
while(!SPI1S_SPTEF);
cs_high();
}
/************************读数据函数*********************************/
void READDATA(unsigned int ADR)
{
cs_low();
SPI1D=READ; //FM25040A读指令
while(!SPI1S_SPTEF);
// SPI1D=ADR; //发送读地址
// while(!SPI1S_SPTEF);
SPI1D=((unsigned char)(ADR>>
8));//0;//发送写高8位地址
while(!SPI1S_SPTEF);
SPI1D=((unsigned char)(ADR));//0;//发送写低8位地址
while(!SPI1S_SPTEF);
rebuff1=SPI1D; //读8位数据
while(!SPI1S_SPRF);
cs_high();
}
void main(void)
{
/*** Processor Expert internal initialization. DON'T REMOVE
THIS CODE!!! ***/
PE_low_level_init();
SPI2_Init(); //SPI初始化
cs_high();
for(k=0;k<maxaddr;k++)
{
WRITEDATA(k,0x11); //把 0x11写入地址K
}
for(;;)
{
delay(2);
// for(d=0;d<maxaddr;d++)
//{
READDATA(0x0011); //读任意地址
//}
//
// if(rebuff1==0x3)
//{
// i++;
//}
}
>>请大家帮忙看看那里有问题。谢谢
>>