📄 spi.#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 + -