IIC总线
两线半双工通信,传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。
SDA线:双向串行数据线,发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。
SCL线:双向串行时钟线,所有主机在SCL线上产生它们自己的时钟来传输I2C总线上的报文。数据只在时钟的高电平周期有效,因此需要一个确定的时钟进行逐位仲裁。时钟同步通过线与连接I2C 接口到SCL 线来执行。这就是说SCL 线的高到低切换会使器件开始数它们的低电平周期,而且一旦器件的时钟变低电平,它会使SCL 线保持这种状态直到到达时钟的高电平。但是如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL 线的状态。因此SCL 线被有最长低电平周期的器件保持低电平。此时低电平周期短的器件会进入高电平的等待状态。
void Write_IIC_Byte(unsigned char IIC_Byte)
{
uint32_t i=0;
oled_sda_mode(GPIO_Mode_OUT);//输出模式
SCL=0;
SDA_W=0;
delay_us(1);
for(i=0;i<8;i++)//MSB最高位有效进行数据的发送
{
if(IIC_Byte & (1<<(7-i)))
SDA_W=1;
else
SDA_W=0;
delay_us(1);
SCL=1;
delay_us(1);
SCL=0;
delay_us(1);
}
}
SPI总线
四线全双工通信,以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK – Serial Clock,时钟信号,由主设备产生;
(4)CS – Chip Select,从设备使能信号,由主设备控制。
SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
uint8_t spi_rc522_send_byte(uint8_t txd)
{
int32_t i=0;
uint8_t d=0;
for(i=7; i>=0; i--)
{
//设置MOSI引脚的电平
if(txd & (1<<i))// txd & (1<<7)
GPIO_SetBits(MOSI);
else
GPIO_ResetBits(MOSI);
//时钟线为输出低电平,这个时候,从机就读取该电平
GPIO_ResetBits(SCK);
Delay1_us(1);
//时钟线为输出高电平,这个时候,从机输出有效的数据给主机识别
GPIO_SetBits(SCK);
Delay1_us(1);
//读取MISO引脚的电平
if(GPIO_ReadInputDataBit(MISO))
d|=1<<i;
}
return d;
}