PIC单片机之SPI从机框架
2019-04-15 11:54发布
生成海报
#include
#include
#include
__CONFIG(0x3F32); //芯片配置字 选择HS模式振荡器,关WDT
typedef unsigned char uchar;
typedef unsigned int uint;
uchar resive=0;
uchar resive1=0;
uchar send_buf[16]={'S',0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xc,0xD,0xe,0xf};
uchar send_num=0;
uchar resive_flag=0;
#define CS RA5
uchar spi_data_buf;
/***********************************************************/
//函数名称:delay_ms
//函数功能:软件延时T*ms
//返回值:无
/***********************************************************/
void delay_ms(uint T) //单位时间Tms延时
{
uchar time;
while(T--)
for(time=0;time<250;time++);
}
//*************************************************************************************
// Send one byte via UART
//*************************************************************************************
void uart_send(unsigned int mydata_byte) {
while(!TRMT); // make sure buffer full bit is high before transmitting
TXREG = mydata_byte; // transmit data
}
/************************************************************/
//串口初始化
/************************************************************/
void UART_INT()
{
PIR1|=0x30;
SYNC=0;
SPEN=1;
RCIE=1;
CREN=1;
TXIE=1;
TXEN=1;
BRGH=1;
RCIF=0;
RX9=0;
TX9=0;
SPBRG=0X19;//异步接收 波特率9600
TRISC7=1;
TRISC6=0;
}
/***********************************************************/
//函数名称:SPI_INIT
//函数功能:SPI初始化 作为从机
//返回值:无
/***********************************************************/
void SPI_INIT()
{
PIR1|=0x08; //SPI中断使能
TRISC3=1; // SCK 输入
TRISC4=1; // SDI 输入
TRISC5=0; // SDO 输出
TRISA5=1; // SS 输入
SSPBUF=0x00;
SSPCON=0x34; // SSPEN CKP SSPM 0100
SSPIE=1;
SSPIF=0;
}
/***********************************************************/
//函数名称:spi_send_byte()
//函数功能:SPI发送数据
//返回值:无
/***********************************************************/
void spi_send_byte(unsigned char byte)
{
SSPBUF = byte;
while(BF==0); //等待发送完毕
SSPIF = 0;
}
void main()
{
SPI_INIT();//SPI初始化
UART_INT();
INTCON|=0xC0; //从模式时候打开
while(1)
{
uart_send(resive1);
delay_ms(1000);
uart_send(resive);
//uart_send(resive_buf);
delay_ms(1000);
}
}
void interrupt isr(void)
{
if(SSPIF==1)
{
SSPIF=0;
resive=SSPBUF;
if((resive)==0x05 && (resive_flag==0))
{
resive_flag=1;
SSPBUF=send_buf[send_num];
send_num++;
if(send_num>15)
{
send_num=0;
}
}
else
{
SSPBUF=0X55;
}
WCOL=0;
}
else if(RCIF)
{
RCIF=0;
resive1=RCREG;
}
else if(TXIF&&TXIE)
{
TXIE = 0;
}
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮