📄 spi.c
字号:
#include "spi.h"
void init_SPI(void)//SPI Master mode
{
SSPCON1bits.SSPM3=0;
SSPCON1bits.SSPM2=0;
SSPCON1bits.SSPM1=0;
SSPCON1bits.SSPM0=0;//Master mode, clock = FOSC/4--->1MHZ
SSPCON1bits.CKP=0;// 1 = Idle state for clock is a high level / 0 = Idle state for clock is a low level
SSPSTATbits.SMP=1;//Sample bit-->1 = Input data sampled at end of data output time
SSPSTATbits.CKE=1;// 1 = Output data at rise edge
TRISCbits.TRISC5=0;//SDO-output
TRISCbits.TRISC3=0;//SCK-output
//TRISCbits.TRISC4=1;//SDI-input
SSPCON1bits.SSPEN=1;//Synchronous Serial Port Enable bit
PIR1bits.SSPIF=0;//The transmission/reception is complete (must be cleared by software)
}
uchar SPI_read ( uchar addr)
{
uchar data;
SSPBUF = addr;
if(SSPCON1bits.WCOL==1) // Write Collision Detect bit (Transmit mode only)
{
SSPCON1bits.WCOL=0;
/*
Any write to the
SSPBUF register during transmission/reception of data
will be ignored and the write collision detect bit WCOL
of the SSPCON1 register, will be set.
*/
//while(PIR1bits.SSPIF==0);
//PIR1bits.SSPIF=0;
}
//SSPBUF = addr;
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{ //uselessdata
data=SSPBUF; //just do clear BF. the data is useless data
}
SSPBUF = 0xff;//00;//just put a any data in sspbuf
if(SSPCON1bits.WCOL==1) //写冲突检测
{
SSPCON1bits.WCOL=0;
}
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
data=SSPBUF;
}
return data;
}
void SPI_write(uchar data)
{
uchar uselessdata;
SSPBUF=data;
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
uselessdata=SSPBUF;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -