首页>>论坛 >>技术社区 >>飞思卡尔社区论坛 >>32位MCU
|
我要发帖  | 我要投票  | 我要回复  | 收藏
1

关于 SPI模块编程

版主: 大学IV队  南京老练   
关于 SPI模块编程
 

大家好。请问谁有用过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++;
       //}
   }
 

请大家帮忙看看那里有问题。谢谢
 

 
相关主题
回复 链接 收藏
 
回复:关于 SPI模块编程
 

我也想知道啊,怎么没有人回答啊。

 
回复 链接 收藏
 
RE:关于 SPI模块编程
 
你贴一大堆代码,没人有耐心看的。我建议你还是用示波器看看输出对不对吧。
 
“谌”应该读shen,不读chen
回复 链接 收藏
 
RE:关于 SPI模块编程
 
 
坚持就是胜利
回复 链接 收藏
 
我要发帖  | 我要投票  | 我要回复  | 收藏
1