OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 430用模拟SPI写25q32,无输出求大神正解(带源程序)

共1条 1/1 1 跳转至

430用模拟SPI写25q32,无输出求大神正解(带源程序)

菜鸟
2015-09-29 10:04:46    评分
430用模拟SPI写25q32,无输出求大神正解(带源程序) 就是输入都没问题,但是就是没得输出DO一直处于高阻状态。。。卡了几天了,,,求大神带我飞,,,,QAQ
/******SPI.C文件********/
#include "SPI_ml.h"
#define SDI_1 Pinout(1,0,1)
#define SDI_0 Pinout(1,0,0)


#define SCK_1 Pinout(1,2,1)
#define SCK_0 Pinout(1,2,0)

#define SPI_SS_1 Pinout(1,5,1)
#define SPI_SS_0 Pinout(1,5,0)

#define I0_SDO1 (P1IN&BIT1)//备用按钮
uchar atey[10];
void Pinout(unsigned char pinx,unsigned char pin,unsigned char out)
{
  if(pinx==1)
  {
    switch(pin)
    {
      case 0:
            if(out==1){ P1OUT |= BIT0;}
            else{P1OUT &= ~BIT0;}break;
      case 1:
            if(out==1){ P1OUT |= BIT1;}
            else{P1OUT &= ~BIT1;}break;
      case 2:
            if(out==1){ P1OUT |= BIT2;}
            else{P1OUT &= ~BIT2;}break;
      case 3:
            if(out==1){ P1OUT |= BIT3;}
            else{P1OUT &= ~BIT3;}break;
      case 4:
            if(out==1){ P1OUT |= BIT4;}
            else{P1OUT &= ~BIT4;}break;
      case 5:
            if(out==1){ P1OUT |= BIT5;}
            else{P1OUT &= ~BIT5;}break;
      case 6:
            if(out==1){ P1OUT |= BIT6;}
            else{P1OUT &= ~BIT6;}break;
      case 7:
            if(out==1){ P1OUT |= BIT7;}
            else{P1OUT &= ~BIT7;}
            break;    
    }
  }
   else if(pinx==2)
  {
    switch(pin)
    {
      case 0:
            if(out==1){ P2OUT |= BIT0;}
            else{P2OUT &= ~BIT0;}break;
      case 1:
            if(out==1){ P2OUT |= BIT1;}
            else{P2OUT &= ~BIT1;}break;
      case 2:
            if(out==1){ P2OUT |= BIT2;}
            else{P2OUT &= ~BIT2;}break;
      case 3:
            if(out==1){ P2OUT |= BIT3;}
            else{P2OUT &= ~BIT3;}break;
      case 4:
            if(out==1){ P2OUT |= BIT4;}
            else{P2OUT &= ~BIT4;}break;
      case 5:
            if(out==1){ P2OUT |= BIT5;}
            else{P2OUT &= ~BIT5;}break;
      case 6:
            if(out==1){ P2OUT |= BIT6;}
            else{P2OUT &= ~BIT6;}
            break;
      case 7:
            if(out==1){ P2OUT |= BIT7;}
            else{P2OUT &= ~BIT7;}break;            
    }
  }
}
void delay_spi(unsigned int x)//1us 11M
{
	unsigned char i,c;
	for(i=0;i<x;i++)
	{
	  c++;
          c++;
	}
}
/*****等待写入结束******/
void waitwiriteEND(uint x)
{
	uint i;
	for(i=0;i<x;i++)
	{
		SCK_0;
		delay_spi(5);
		SCK_1;
		delay_spi(5);
	}
}
//初始化SPI
void int_SPI()
{
 SCK_1;		//置高时钟
 SPI_SS_1;
}
/*********发送一个字节************/
void send_SPI(unsigned char data_send)
{
	unsigned char i,s=0;
	for(i=0;i<8;i++)
	{
	        SCK_0;
               s=(data_send&0x01);
                if(s==1)
                  SDI_1;
                else
                  SDI_0;
		delay_spi(5);
		SCK_1;
		delay_spi(5);
		data_send>>=1;
	}
}
/*********读取一个字节************/
unsigned char read_SPI()
{
	unsigned char i,data_read=0;
	for(i=0;i<8;i++)
	{
		data_read<<=1;
		SCK_0;
		delay_spi(5);
		SCK_1;
		delay_spi(5);
                
		data_read|=I0_SDO1;
	}
	return data_read;
}
/*********发送写入允许指令************/
void write_SR()
{
	/*****发送第一个字节——指令1****/
	SPI_SS_0;
	//send_SPI(byte1);//写使能06 04
	send_SPI(write_1);//写使能06 04
	SPI_SS_1;
}
/*********读取寄存器************/
void read_SR()
{
	uchar read_sr1;
	//uchar read_sr2=0;
	/*****发送第一个字节——指令1****/
	SPI_SS_0;
	send_SPI(read_SR_1);//读状态寄存器1 05 35
//ead_sr1=read_SPI();
//	SPI_SS=1;
//	SPI_SS=0;
//	send_SPI(read_SR_2);//读状态寄存器2 05 35
//	read_sr2=read_SPI();
	SPI_SS_1;
}
/*********写入多个字节***********/
void write_data_ye(uchar *p,u32 sendAddr,uchar tx)
{
	uchar i;
	write_SR();
	/*****发送第一个字节——指令1****/
	SPI_SS_0;
	send_SPI(PP);//页写数据
	send_SPI((sendAddr&0xFF0000)>>16);//地址1高
	send_SPI((sendAddr&0xFF00)>>8);//地址2
	send_SPI(sendAddr&0xFF);//地址3低
	for(i=0;i<tx;i++)
	send_SPI(p[i]);
	SPI_SS_1;
}
/*********读取多个字节***********/
void read_datac(u32 readAddr,uchar rx)
{
	uchar i;
	/*****发送第一个字节——指令1****/
	SPI_SS_0;
	send_SPI(read_data);//读数据
	send_SPI((readAddr & 0xFF0000) >> 16);//地址1高
	send_SPI((readAddr & 0xFF00) >> 8);//地址2
	send_SPI(readAddr & 0xFF);//地址3低
        while(rx--)
        {
                atey[i]=read_SPI();
        }
	SPI_SS_1;//结束,关闭模块
}
/*********扇区擦除***********/
void Erase_datac(u32 readAddr)
{
	/********允许写入命令*******/
	write_SR();
	SPI_SS_0;
	send_SPI(SE);//读数据
	send_SPI((readAddr & 0xFF0000) >> 16);//地址1高
	send_SPI((readAddr & 0xFF00) >> 8);//地址2
	send_SPI(readAddr & 0xFF);//地址3低
		waitwiriteEND(40);
	SPI_SS_1;//结束,关闭模块

}

void SPI_FLASH_BulkErase(void)
{
	/********允许写入命令*******/
	write_SR();
	SPI_SS_0;
	send_SPI(SE);//读数据
	SPI_SS_1;//结束,关闭模块
	waitwiriteEND(50);
}
void ccc()
{
	uint i;
	SPI_SS_0;
	send_SPI(0x9f);
        	waitwiriteEND(36);
	for(i=0;i<5;i++)
	{	
//	atey[i]=read_SPI();
	}
	SPI_SS_1;
	SPI_SS_0;
	send_SPI(0xAB);
	for(i=5;i<10;i++)
	{
	//atey[i]=read_SPI();
	}         
        waitwiriteEND(30);
	SPI_SS_1;
}

 

/*******spi.h文件**********/
#ifndef __SPI_ml__
#define __SPI_ml__
#include "main.h"
/*********状态寄存器16位*************/
#define writeb	0x50		//设置写使能为挥发性
#define busy  0x01   //忙检测
#define WEL   0x02	//写使能 :低位
#define BP_0  0x04		//内存保护CMP=0 SEC=0 TB=0最高110
#define SRP_1 0x80  //写保护直到下次断电才可改变写:低位
#define SRP_3 0x01 //写控制要WP=1 可写:高位 
#define SUS 	0x80	//擦除状态位 为1执行擦除:高位
#define LB_0	0x00  //安全解锁 :高位 
/************第一个字节为指令 集1**************/
#define write_1	0x06 //写使能	 
#define write_0	0x04 //写禁止
#define read_SR_1	0x05 //读状态寄存器1	
#define read_SR_2	0x35 //读状态寄存器2	
#define write_SR_01	0x01 //写入状态寄存器(3个字节)S7——S0 S15—S8	
#define PP 					0x02  //页编程 A23-A0 D7_D0(第5个字节)
#define QPP					0x32	//4页编程A23—A0
#define SE 					0x20	//扇区擦除4kb
#define BE0 				0x52   //块擦除32ke
#define BE1					0xd8	//块擦除64kb
#define CE 					0xc7	//芯片擦除
#define EPR   			0x75	//编程暂停擦除
#define PD   				0xb9	//编程恢复
#define read_rese   0xff	//连续读取模式
/************第一个字节为指令 集2**************/
#define read_data		0x03 //读数据	 地址A23——A0 数据D7_D0(字节5)
#define fast_read		0x0b //快速读取
#define read_SR_12		0xeb //快速读取4 I / O EBH A23-A0,M7-M0( 4)(X,X,X,X,D7-D0,......)(5)(D7-D0,......)
//7.最低地址位必须为0(A0 = 0)8.最低4位地址位必须为0(A0,A1,A2,A3 = 0)

extern  uchar atey[10];
void delay_spi(unsigned int x);//1us 11M
void int_SPI();
void send_SPI(unsigned char data_send);
unsigned char read_SPI();
void read_datac(u32 readAddr,uchar rx);//读取多个字节
void read_SR();
void write_SR();
void write_data_ye(uchar *p,u32 sendAddr,uchar tx);//写 页
void Erase_datac(u32 readAddr);//扇区擦除
void SPI_FLASH_BulkErase(void);//全部擦除
void Pinout(unsigned char pinx,unsigned char pin,unsigned char out);
void ccc();
#endif

 

#ifndef __CONFIG_H__ 
#define __CONFIG_H__ 

//#include "msp430x54x.h"
#include "msp430G2553.h"
#ifndef TRUE
#define TRUE  1
#endif

#ifndef FALSE
#define FALSE 0
#endif
//#define   Debug             //调试软件
#define uchar   unsigned char //无符号8位整型变量  
#define uint    unsigned int  //无符号32位整型变量 
#define u32    unsigned long  //无符号32位整型变量 

typedef signed   char  int8;     //有符号8位整型变量  
typedef unsigned short uint16;   //无符号16位整型变量 
typedef signed   short int16;    //有符号16位整型变量 

typedef signed   int   int32;    //有符号32位整型变量 
typedef float          fp32;     //单精度浮点数(32位长度) 
typedef double         fp64;     //双精度浮点数



#endif

 

/*******主函数部分**********/
#include "main.h"
#include "SPI_ml.h"
#define SHP 0x001
#define I0_RB (P1IN&BIT7)//上
#define I0_RU (P1IN&BIT6)
#define  FLASH_WriteAddress     0x00000
void Pinout(unsigned char pinx,unsigned char pin,unsigned char out);//管脚使能函数
void IO_INTI();                       //IO口初始化
void BasicClock_Init();               //时钟源初始化
void IO_INTI()
{
  //P1全输入
  P1DIR = 0xfd;//1111 1101
  //配置输入
 P1REN |=BIT1;
 P1OUT|=BIT1;
}
void BasicClock_Init()
{    //设置时钟源        
  if(CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)            
  {                   while(1);             }             
 /*********调整DC0频率************/
  BCSCTL1  = CALBC1_1MHZ;  //DCO ---1MHz             
  DCOCTL   = CALDCO_1MHZ;             
  BCSCTL3 |= LFXT1S_0;             
  IFG1    &= ~OFIFG;               
  BCSCTL2 |= SELM_0 + DIVM_2+DIVA_1;     //MCLK使用DC01MHZ,SMCLK采用125k时钟           
}
void main()
{
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  BasicClock_Init();    //时钟初始化
//  Capture_GPIO_Init(); //定时器初始化
  IO_INTI();           //管脚初始化 BTS
  int_SPI();
//Erase_datac(FLASH_WriteAddress);//擦除模块
//	write_data_ye(b,FLASH_WriteAddress,10);//写页
//read_datac(FLASH_WriteAddress,10);//读取页
 //ead_SR();
ccc();
  while(1)
  {  
    Pinout(1,0,1);
  }
}

 




关键词: msp 430 25q32    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]