⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.#3

📁 f330与mfrc522 通信 构成读卡器 上传源码和原理图。
💻 #3
字号:
//*********************************************************// 项  目:  通用控制器-V1.0// 文件名: 	Spi.c// 描  述:  SPI收发程序//*********************************************************//===============================================#include "main.h"    //全部头文件
#include "spi.h"     //头文件
#include "Uart0.h"     //头文件
#include "Timer2.h"     //头文件//===============================================
/***************************************************/
UCHAR code TX_ADDRESS[TX_ADR_WIDTH]  = {0x54,0x53,0x57,0x58,0x01}; //定义‘TSWX1' TX address
UCHAR xdata Ptr6_reg[40];
UCHAR xdata rx_buf[TX_PLOAD_WIDTH];
UCHAR xdata tx_buf[TX_PLOAD_WIDTH];
UCHAR flag;
UCHAR Ptr_Mode;				          //***********************************************// 变量定义/**************************************************/
UCHAR 	bdata sta;
sbit	RX_DR	=sta^6;
sbit	TX_DS	=sta^5;
sbit	MAX_RT	=sta^4;

extern   UCHAR  data  Sio_Lth;
extern  UCHAR  idata  ComTBufHead;					 
extern  UCHAR  xdata  ComTBuf[Com0TBuf_len];	//***********************************************// 函数开始//***********************************************//初始化SPI//-----------------------------------------------void Init_Spi(void){                    //BSY,MEN,CKPH,CKPL,SLV,NSS,SRMT,RXBMT   SPI0CFG = 0x40;  // 0  1(主)0   0    0   0    0    0                    //SPIF,WCOL,MODF,ROVER,NSS1,NSS0,TBMT,SPIEN   SPI0CN  = 0x03;  //  0    0    0    0    0     0    1    1   SPI0CKR = SYSCLK/2/1000000-1;  //1MHz SPI时钟}//***********************************************//无线模块初始化:-,M_RX,M_TX,M_RT,ECRC,CRC8,PWRUP,REV
//                0   0    0   0     1    0   1    1(收)
//收、发事件IRQ,CRC使能,上电,接收模式//***********************************************void Init_Ptr6(void)   //

     {
	   RX_Mode();
       Ptr_Mode = 0x0f;
	   //Tst_Ptr6();      //
	 }
//***********************************************//无线模块中断:INT0 中断//***********************************************
void PTR6_INT(void) interrupt 0	//INT0 中断

    {
	   UCHAR kk,i;

	   kk=0;
   	   sta=SPI_Read(STATUS);	// read STATUS'

	  if(RX_DR)				//

	    {  //是接收中断从接收FIFO读接收包,置标志。
		  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// 
		  flag=1;
		  //
		  kk = rx_buf[1];
		  for(i=0;i<kk;i++)   //TX_LENTH=32
          ComTBuf[i] = rx_buf[i];  //清SPI发送缓存
		  ComTBufHead=1;
	      Sio_Lth = ComTBuf[1];  
	      SBUF0   = ComTBuf[0];	 //启动串口发送 
     	}

	  if(MAX_RT)
	    {         //如果重发次数溢出,清发送FIFO
		  SPI_RW_Reg(FLUSH_TX,0);  
	    }
       
        // 清RX_DR/TX_DS/MAX_RT中断标志
	      SPI_RW_Reg(WRITE_REG+STATUS,sta);
	      kk= sta; 
}

/**************************************************
功能描述: 写一字节到 nRF24L01的同时返回写期间
从nRF24L01读出的字节。
/**************************************************/
UCHAR SPI_RW(UCHAR byte)
{
    SPI0DAT = byte;       	while (SPIF == 0);	  //等待命令发送结束

    byte  = SPI0DAT;      //读无效输入
	SPIF  = 0;
    return(byte);           		  // return read byte
}
//***********************************************//读PTR6000 寄存器:读reg指定的寄存器,值在reg_val//***********************************************
UCHAR SPI_Read(UCHAR reg)
{
	UCHAR reg_val;

  	CSN = 0;                // 使能
  	SPI_RW(reg);            // 读命令
  	reg_val = SPI_RW(0);    // 读数据
  	CSN = 1;                // 禁止

  	return(reg_val);        // return register value
}
//***********************************************//写value到reg寄存器//***********************************************
UCHAR SPI_RW_Reg(UCHAR reg, UCHAR value)
{
	UCHAR status;

  	CSN = 0;                   // CSN low, init SPI transaction
  	status = SPI_RW(reg);      // select register
  	SPI_RW(value);             // ..and write value to it..
  	CSN = 1;                   // CSN high again

  	return(status);            // return nRF24L01 status byte
}
//***********************************************//读reg指定位置bytes个数据字节到*pBuf/**************************************************/

UCHAR SPI_Read_Buf(UCHAR reg, UCHAR *pBuf, UCHAR bytes)
{
	UCHAR status,i;

  	CSN = 0;                // Set CSN low, init SPI tranaction
  	status = SPI_RW(reg);   // Select register to write to and read status byte

  	for(i=0;i<bytes;i++)
    pBuf[i] = SPI_RW(0);    // Perform SPI_RW to read byte from nRF24L01

  	CSN = 1;                // Set CSN high again

  	return(status);         // return nRF24L01 status byte
}
//***********************************************//将*pBuf的bytes内容写到reg指定的寄存器
/**************************************************/
UCHAR SPI_Write_Buf(UCHAR reg, UCHAR *pBuf, UCHAR bytes)
{
	UCHAR status,i;

  	CSN = 0;                 // 
  	status = SPI_RW(reg);    // 
  	for(i=0; i<bytes; i++)   //
    SPI_RW(*pBuf++);
  	CSN = 1;                 // 
  	return(status);          // 
}
//***********************************************//PTR6000 置接收模式
/**************************************************/
void RX_Mode(void)
{
	CE=0;
  	SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 

  	SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // 使能0#自动应答

  	SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // 使能0#

  	SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // 射频通道40

  	SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); //RX/TX包宽度

  	SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm,1Mbps,增益

  	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     //  CRC(2 bytes),上电,接收模式.

  	CE = 1; // 进入接收方式

}
/**************************************************///PTR6000 置发射模式-写数据并发射spi_tbuf[i]16字节/**************************************************/
void TX_Mode(void)
{
	CE=0;
	
  	SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
  	SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
  	SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // Writes data to TX payload

  	SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
  	SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
  	SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
  	SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40
  	SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
	CE=1;
}
/***********************************************
void Tst_Ptr6(void)  //
    {
	  CE = 0;                                //进入待机模式1
	  Ptr_Mode = 0x0f;                       //保存当前工作方式 
	  SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);     //
//	  SPI_RW_Reg(WRITE_REG+EN_AA,0X01);      //自动应答使能(默认0x3f)
//	  SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);  //接收地址允许(默认0x03)
//	  SPI_RW_Reg(WRITE_REG+SETUP_AW,0X0f);   //收/发地址宽度(默认0x03)
//    SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X0f); //自动重发(默认0x03)
//	  SPI_RW_Reg(WRITE_REG+RF_CH,40);        //射频通道(默认0x02)
//	  SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);   //射频寄存器(默认0x0F)
	  SPI_RW_Reg(WRITE_REG+STATUS,0x0f);     //状态寄存器(默认0x0e)
//	  SPI_RW_Reg(WRITE_REG+OBSERVE_TX,0X0f); //发送检测寄存器(只读,默认0)
//	  SPI_RW_Reg(WRITE_REG+CD ,0X0f);        //载波检测(只读,默认0)

      SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);  //通道0地址"TSWX1"
//	  SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,TX_ADDRESS, TX_ADR_WIDTH);  //通道1地址"tswx2"
	  SPI_Write_Buf(WRITE_REG + 0x0c, TX_ADDRESS, 1);   //通道2地址0xC3
	  SPI_Write_Buf(WRITE_REG + 0x0c, TX_ADDRESS, 1);   //通道3地址0xC4
	  SPI_Write_Buf(WRITE_REG + 0x0c, TX_ADDRESS, 1);   //通道4地址0xC5
	  SPI_Write_Buf(WRITE_REG + 0x0c, TX_ADDRESS, 1);   //通道5地址0xC6 
	  //
      SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //发送地址
	  //
      SPI_RW_Reg(WRITE_REG + RX_PW_P0,TX_PLOAD_WIDTH);    //通道数据宽度20
	  SPI_RW_Reg(WRITE_REG + RX_PW_P1,TX_PLOAD_WIDTH);    //
      SPI_RW_Reg(WRITE_REG + RX_PW_P2,TX_PLOAD_WIDTH);    //
      SPI_RW_Reg(WRITE_REG + RX_PW_P3,TX_PLOAD_WIDTH);    //
	  SPI_RW_Reg(WRITE_REG + RX_PW_P4,TX_PLOAD_WIDTH);    //
 	  SPI_RW_Reg(WRITE_REG + RX_PW_P5,TX_PLOAD_WIDTH);    //

      Read_All_Reg();          //读PTR6所有寄存器
	  CE = 1;              //进入接收模式	   
	} */
/***********************************************///读ptr6所有寄存器//***********************************************
/*void Read_All_Reg(void)
    {
	  unsigned char i;

      for (i=0;i<40;i++)

          Ptr6_reg[i] = 0;

	  Ptr6_reg[0] = SPI_Read(0);
	  Ptr6_reg[1] = SPI_Read(1);
	  Ptr6_reg[2] = SPI_Read(2);
	  Ptr6_reg[3] = SPI_Read(3);
	  Ptr6_reg[4] = SPI_Read(4);
	  Ptr6_reg[5] = SPI_Read(5);
	  Ptr6_reg[6] = SPI_Read(6);
	  Ptr6_reg[7] = SPI_Read(7);
	  Ptr6_reg[8] = SPI_Read(8);
	  Ptr6_reg[9] = SPI_Read(9);
	  //
	  SPI_Read_Buf(RX_ADDR_P0,&Ptr6_reg[10],TX_ADR_WIDTH);
      SPI_Read_Buf(RX_ADDR_P1,&Ptr6_reg[15],TX_ADR_WIDTH);
      SPI_Read_Buf(RX_ADDR_P2,&Ptr6_reg[20],1);
      SPI_Read_Buf(RX_ADDR_P3,&Ptr6_reg[21],1);
	  SPI_Read_Buf(RX_ADDR_P4,&Ptr6_reg[22],1);
      SPI_Read_Buf(RX_ADDR_P5,&Ptr6_reg[23],1);
	  SPI_Read_Buf(TX_ADDR,&Ptr6_reg[24],TX_ADR_WIDTH);
      //
	  Ptr6_reg[29] = SPI_Read(0x11);
	  Ptr6_reg[30] = SPI_Read(0x12);
	  Ptr6_reg[31] = SPI_Read(0x13);
	  Ptr6_reg[32] = SPI_Read(0x14);
	  Ptr6_reg[33] = SPI_Read(0x15);
	  Ptr6_reg[34] = SPI_Read(0x16);
	  Ptr6_reg[35] = SPI_Read(0x17); 
	}  *///***********************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -