spi.c

来自「单片机PIC控制GSM发送SMS,然后控制汽车和提供地图」· C语言 代码 · 共 77 行

C
77
字号
#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 + =
减小字号Ctrl + -
显示快捷键?