本文使用到的软件:Keil MDK,串口调试助手
本文使用到的硬件:PC机,STM32最小系统开发板,0.96寸OLED显示屏
一、SPI通信协议简介
-
与I2C协议一样,对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。
-
物理层
(1)SS( Slave Select)
:从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。
(2)SCK (Serial Clock)
:时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
(3)MOSI (Master Output, Slave Input)
:主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
(4)MISO(Master Input,,Slave Output)
:主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。 -
协议层
二、显示自己的学号和姓名
- 部分代码
void GUI_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size,u8 mode)
{
unsigned char j=0,csize;
if(Char_Size == 16)
{
csize = Char_Size/2;
}
else if(Char_Size == 8)
{
csize = Char_Size/2+2;
}
else
{
return;
}
while (chr[j]!='\0')
{
GUI_ShowChar(x,y,chr[j],Char_Size,mode);
x+=csize;
if(x>120)
{
x=0;
y+=Char_Size;
}
j++;
}
}
void GUI_ShowFont32(u8 x,u8 y,u8 *s,u8 mode)
{
u8 i,j,k,tmp;
u16 num;
num = sizeof(cfont32)/sizeof(typFNT_GB32);
for(i=0;i<num;i++)
{
if((cfont32[i].Index[0]==*s)&&(cfont32[i].Index[1]==*(s+1)))
{
for(j=0;j<128;j++)
{
if(mode)
{
tmp = cfont32[i].Msk[j];
}
else
{
tmp = ~(cfont32[i].Msk[j]);
}
for(k=0;k<8;k++)
{
if(tmp&(0x80>>k))
{
OLED_Set_Pixel(x+(j%4)*8+k, y+j/4,1);
}
else
{
OLED_Set_Pixel(x+(j%4)*8+k, y