发布网友 发布时间:2022-04-25 04:19
共3个回答
热心网友 时间:2023-10-25 12:19
第一个区别当然是名字:
SPI(Serial Peripheral Interface:串行外设接口);
I2C(INTEL IC BUS:英特尔IC总线)
UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)
第二,区别在电气信号线上:
SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。
假如用通用IO口模仿SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,假如要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。
I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非常常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。
如果用通用IO口模仿I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备)
热心网友 时间:2023-10-25 12:19
你看看这个http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=917470
其实主要的部分也就两段,初始化和发送数据
初始化:
DDRB = 0x2C; //SPI端口初始化
PORTB = 0x15; //开启按键上拉
DDRD = 0x01;
TCCR0 = 0x05; //系统时钟1024分频
TCNT0 = 0;
SPCR = 0x7E; //SPI使能,SCK空闲保持为高电平,数据在上升沿采样,速率为1:128(FOSC/128)
SPSR = 0x01; //使能倍速
发送数据:
unsighed char senddata(unsigned char data)
{
SS = 0;
SPDR = data;
while((SPSR & 0x80) == 0);
data = SPDR;
return data;
SS = 1;
}
热心网友 时间:2023-10-25 12:19
真好我自己封装了硬件SPI程序,拿来分享下
//#include <mega128.h>
//其他型号更改对应的SPI端口
void init_spi(void)
{
PORTB=0X21;
DDRB=0XFD;
SPCR=0X50; //0101 0000 SPI允许 高位在先 主机模式 模式0 四分频率
}
void spi_write(uchar temp)
{
SPDR=temp;
while(!(SPSR&(1<<SPIF)));
}
uchar spi_read(void)
{
uchar data;
SPDR=0x00;
while(!(SPSR&(1<<SPIF)));
data=SPDR;
return data;
}