/****串行通信初始化***/
void spi_init()
{
TRISC2=0;//SDO设置为输出
TRISC5=0;//CSB设置为输出
TRISC3=0;//FCSB设置为输出
TRISC0=0;//SCK设置为输出
TRISC1=1;//gpio设置为输入
TRISA2=1;//gpio设置为输入
SSPCON1=0B00100010;//使能串口 f/64 串口时钟 SPI主控模式 周期16uS
SSPCON3bits.BOEN=1;
SSPSTAT=0B01000000;//在输出数据中间采样输入数据 下降沿发送数据
RC3=1;//拉高
RC5=1;
}
/****串口数据交换***/
void transmit_spi(unsigned char byte)
{
SSP1BUF=byte;//装入待发送数据
while(!PIR1bits.SSP1IF);//判断数据是否发送完
PIR1bits.SSP1IF=0;
TEMP=SSP1BUF;//读回收到的数据
}
void delay(unsigned int t)//延时1ms
{
unsigned x,y;
for(x=t;x>0;x--)
for(y=100;y>0;y--);
}
/****写寄存器***/
void write_rf(unsigned char ADD,unsigned char DATA)//写寄存器
{
TRISC2=0;//SDO设置为输出
RC5=0;//CSB 拉低片选至少半个SCLK 周期
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
transmit_spi(ADD&0x7F); //写一个地址
transmit_spi(DATA); //写一个数据
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
RC5=1;
}
/****读寄存器***/
void read_rf(unsigned char ADD)//读寄存器
{
TRISC2=0;//SDO设置为输出
RC5=0;//CSB 拉低片选至少半个SCLK 周期
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
transmit_spi(0X80|ADD); //写一个地址
TRISC2=1;//SDO设置为输入
transmit_spi(0X11); // 写一个空数据
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
NOP(); NOP(); NOP();
RC5=1;
READTEMP=TEMP;
}
此帖出自
小平头技术问答
一周热门 更多>