📄 spi.c
字号:
#include <iom48v.h>
#include <macros.h>
#define uint unsigned int
#define ulong unsigned long
#define uchar unsigned char
#define clk PD0//AD_clk
#define data_IO PD1//AD数据输入输出口
#define cs PD2//AD片选
#define IO_DDR DDD1//数据读入读出口
#define IO_PIN PIND
//#define clk_s PD3
//#define ss_s PD4
//#define data_s PD5
//#define data_sPIN PIND5
//#define data_sDDR DDD5
void spisend(uchar data)//写入
{
uchar i;
//IO_DDR=1;
DDRD |= 0x02;
//clk=0;
PORTD &= 0xfe;
for(i=8;i>0;i--)
{
if ((data&0x01)==1)
{
//data_IO=1;
PORTD |= 0x02;
}
else
//data_IO=0;
PORTD &= 0xFD;
_NOP();
//clk=1;
PORTD |= 0x01;
//_NOP();
//clk=0;
PORTD &= 0xfe;
data>>=1;//右移一位
}
}
uchar spiread(void) //读取
{
uchar i;
uchar data=0x00;
uchar temp;
//IO_DDR=0; //IO口作为输入,DDR要写0
DDRD &= 0xfd;
//ss_r=0;
//clk=0;
PORTD &= 0xfe;
for(i=0;i<8;i++)
{
//clk=1;
PORTD |= 0x01;
//clk=0;
PORTD &= 0xfe;
temp=IO_PIN;
if (temp&0x02) //下降沿采集数据,调换则会出错
data|=(0x01<<i);
}
//IO_DDR=1;
DDRD |= 0x02;
//ss_r=1; //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
// clk=1;
PORTD |= 0x01;
return(data);
}
void main(ulong spidata)
{
uint i,j;
uchar data[4]={0,0,0,0};
uchar instrution[2]={0,0};
/*PORTA="0x00"; //灯指示
DDRA="0XFF";
PORTB="0x00";//0101 0000
DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
PORTC="0x00";
DDRC="0x80";
DDRD="0xff";//0000 0001
PORTD="0x00";*///0100 1000
//cs = 0;
PORTD &= 0xfc;
for(i=0;i<2;i++)
{
spisend(instrution[i]);
}
if(instrution[0]&0x8000)
{
for(j=0;j<4;j++)
{
data[j]=spiread();
}
}
else {
for(j=0;j<4;j++)
{
spisend(data[i]);
}
}
// cs = 1;
PORTD |= 0x40;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -