📄 spi.c
字号:
//********************************************* FM1702.c ***************************************//
//Hardware Connect:
// MCU --------------- FM1702
// HQCCLK <-------------> SCK 13
// HQCDI <-------------> MISO 12
// HQCDO <-------------> MOSI 14
// HQCRST <-------------> RSTPD 23
// HQCMN <-------------> NSS 15
//
// ▅▄▄〓〓▃▃▃▃▃▃▄
// ◢◤—┛
// Со∪итЁя- SтЯiΚе
//**********************************************************************************************//
#include "p18f6720.h" //PIC18F6720 Head File
#include "PIC18F6720_IO.h"
#include "PIC18F6720_PERIPHERYDEVICE.h"
#include "delays.h" //soft delay Head Flie
//Delay1TCY(); delay one TCY
//Delay10TCYx(uchar t); (255~0)*10TCY
//.....100........
//.....1K.........
//.....10K........
//if uchar t = 0 that delay time = 2560000tCY
//*****************************************************************//
//Name :SpiRev
//Input :void
//Output :unsigned char
//Function :This function receive one 8bit byte from fm1702 spi port
//D.R.P :HaoQiu
//Data :06.06.09
//*****************************************************************//
//时钟由MCU提供,在每一个时钟的上升沿,MCU读RF-MISO上的电平,8BIT为一个字节
//先高位,后低位
unsigned char SpiRev()
{
unsigned char iSR,jSR;
unsigned char varr;
HQCCLK=0;
varr=0;
for (iSR=0;iSR<8;iSR++)
{
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=1; // 产生SCK脉冲
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
jSR=HQCDO;
if(jSR)
varr+=1;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=0;
varr<<=1;
Delay1TCY();
Delay1TCY();
Delay1TCY();
}
return varr; // 返回
}
//*****************************************************************//
//Name :SpiSend
//Input :unsigned char var
//Output :void
//Function :This function sent one 8bit byte to fm1702 spi port
//D.R.P :HaoQiu
//Data :06.06.09
//*****************************************************************//
void SpiSend(unsigned char var)
{
unsigned char iSS,tem;
for (iSS=0;iSS<8;iSS++) // 8位字节输出
{
HQCCLK=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
tem=var&0x80; // 选择高位
Delay1TCY();
if (tem==0x80)
HQCDI=1; // 输出高位
else
HQCDI=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=1; // 使SCK为1,上升沿有效
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
var<<=1; // 左移1位
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=0; // 使SCK为低电平
}
HQCDI=1;
}
//**********************************************************************//
//Name :SPIRead
//Input :unsigned char SpiAddress:Fm1702 register address
//Output :unsigned char
//Function :This function read one byte from FM1702 in one address
//D.R.P :HaoQiu
//Data :06.06.09
//**********************************************************************//
unsigned char SPIRead(unsigned char SpiAddress)
{
unsigned char isrd,rdatasrd,tempsrd,tsrd=0;
rdatasrd=0;
SpiAddress <<= 1 ; //LEFT ONE BIT
SpiAddress=SpiAddress | 0x80; //HIGHEST BIT SET 1
HQCCLK=0;
HQCMN=0;
//Send SpiAddress;
for (isrd=0;isrd<8;isrd++)
{
tempsrd=SpiAddress&0x80;
if (tempsrd==0x80) HQCDI=1;
else HQCDI=0;
HQCCLK=1;
Delay1TCY();
Delay1TCY();
Delay1TCY();
SpiAddress<<=1;
HQCCLK=0;
}
//Send SpiAddress;
//Receive data
for (isrd=0;isrd<8;isrd++)
{
HQCCLK=1;
rdatasrd<<=1; //is here??
tsrd=HQCDO;
if (tsrd) rdatasrd+=1;
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
}
HQCMN=1;
return(rdatasrd);
}
//*****************************************************************//
//Name :SPIWrite
//Input :unsigned char SpiAddress:Fm1702 register address
// :unsigned char dat :what data for write
//Output :void
//Function :This function write one byte data to FM1702 in one address
//D.R.P :HaoQiu
//Data :06.06.09
//*****************************************************************//
void SPIWrite(unsigned char SpiAddress,unsigned char SpiData)
{
unsigned char ispw,kspw,tempspw,tspw=0;
SpiAddress <<= 1;
SpiAddress=SpiAddress &0x7e;
HQCCLK=0;
HQCMN=0;
//Send SpiAddress
for (ispw=0;ispw<8;ispw++)
{
tempspw=SpiAddress&0x80;
if (tempspw==0x80) HQCDI=1;
else HQCDI=0;
Delay1TCY();
HQCCLK=1;
SpiAddress<<=1;
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
}
// Send data;
for(kspw=0;kspw<8;kspw++)
{
tempspw=SpiData&0x80;
Delay1TCY();
if (tempspw==0x80) HQCDI=1;
else HQCDI=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
HQCCLK=1;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
SpiData<<=1;
HQCCLK=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
}
HQCMN=1;
tspw=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -