安徽省住房与城乡建设厅网站,自己做设计图的app,Wordpress 防注入代码,邯郸网站建设公司排名协议与硬件概述
SPI
SPI是串行外设接口#xff08;Serial Peripheral Interface#xff09;的缩写。是一种高速的#xff08;10Mbps#xff09;的#xff0c;全双工#xff0c;同步的通信总线#xff0c;并且在芯片的管脚上只占用四根线。 引脚介绍 SCLK#xff1a;…协议与硬件概述
SPI
SPI是串行外设接口Serial Peripheral Interface的缩写。是一种高速的10Mbps的全双工同步的通信总线并且在芯片的管脚上只占用四根线。 引脚介绍 SCLK串行时钟线用于数据的同步。MOSIMaster Output Slave Input主机输出数据从机输入数据。MISOMaster Input Slave Output主机输入数据从机输出数据。CS芯片选择引脚引脚低电平从机工作有效引脚高电平从机工作无效。
全双工通信的数据输出和数据输入是用同一个时钟信号同步的。时钟信号由主设备通过SCK脚提供。 主机不能同时与多个从机通信。多机通信时从机之间共用SCLK、MOSI、MISO三个引脚主机选定与哪一从机通信是拉低该从机的CS片选信号引脚。 在之前的“读取红外键码”中需要通过设置GPIO初始为高电平下降沿触发通过中断处理函数获取有效数据。 在本文中不需要配置具体的读取过程只需要同GPIO_Init一样创建一个结构体通过Init方法初始化即可。 只是因为这款开发板配备了相关的硬件。读写操作由硬件自动完成。 同样情况的还有之前出现的USART开发板也配备了相关的硬件。写操作是直接通过USART_SendData(USART1,Byte);发送一个字节数据。手动实现的字节流和字符串输出函数也是在调用这个方法。并没有像“显示红外键码”时那样按位操作。 红外键码中需要实现的操作比较多是因为开发板没有相关协议的设备和寄存器那个接收器只是用来接收38K滤波判断0和1的。所以在读取时可以用1MHz的TIM频率进行输入捕获而无需关注信号在空中的38KHz这一部分由硬件已经完成了。
MAX7219
LED点阵屏配备了MAX7219驱动电路。 通过SPI发送的数据就需要这一部分解释到点阵屏上。 硬件对外只暴露了5根线VCC、GND、DIN、CS、CLK。 只有DIN没有提过串行数据输入端。 其实就是MOSI点阵屏没必要向主机发送数据所以就省掉了MISO这根线。
在SPI通信中SDI通常是输出SDO是输入。
接线时需要将点阵屏的DIN连接到SPI的SPI_SDI引脚SPI的SPI_SDO引脚闲置即可因为用不到读入数据。 MAX7219和单片计算机连接有三条引线DIN、CLK、LOAD采用16位数据串行移位接收方式。即单片机将16位二进制数逐位发送到DIN端,在CLK上升沿到来前准备就绪CLK的每个上升沿将一位数据移入MAX7219内移位寄存器当16位数据移入完在LOAD引脚信号上升沿将16位数据装入MAX7219内的相应位置在MAX7219内部硬件动态扫描显示控制电路作用下实现动态显示。 文字中的LOAD指的就是原理图中的CS。 MAX7219是高位先行。先发送的第一个字节会作为地址将第二个字节的数据写入到地址指向的寄存器。 接下来要做的就是通过SPI协议发送两个字节数据第一个字节是地址第二个字节是数据。
实现SPI控制LED点阵
SPI部分
SPI并没有直接控制灯的高低电平而是告诉从机让从机去实现。 初始化GPIO 先在原理图中找到对应引脚的接口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;//MISO
GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;
GPIO_Init(GPIOA,GPIO_InitStructure);//SCK MOSI
GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;
GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);
需要注意的就是
原理图的SPO对应SPI协议的MISO而非MOSI。 配置SPI 前面提到了SPI已经被集成到这款开发板中我们不需要手动去实现具体的位操作过程。 只需要创建一个SPI_InitTypeDef类型的结构体把结构体的配置项都给填上就可以。
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_CPOL SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge;
SPI_InitStructure.SPI_DataSize SPI_DataSize_8b;
SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial 7;
SPI_InitStructure.SPI_NSS SPI_NSS_Soft;
SPI_InitStructure.SPI_Mode SPI_Mode_Master;
SPI_Init(SPI1,SPI_InitStructure);SPI_Cmd(SPI1,ENABLE);上面的配置项需要在主机和从机之间提前约定好才能有效地通信。 对于从机部分已经焊死了。 我们需要对照从机的文档对主机进行配置。 通过时钟极性CPOL和时钟相位CPHA来控制主设备的通信模式。 时钟极性CPOL定义时钟空闲状态的电平
CPOL0表示SCLK为0时处于空闲态高电平时为有效态。CPOL1表示SCLK为1时处于空闲态低电平时为有效态。
时钟相位CPHA定义数据的采集时间
CPHA0在时钟的第1个跳变沿进行数据采样第2个边沿发送数据。CPHA1在时钟的第2个跳变沿进行数据采样第1个边沿发送数据。
这两个选项需要对照从机的手册进行配置。 SPI_BaudRatePrescaler波特率预分频器。SPI挂载在APB2上为32MHz需要调整到10Mhz以下。256分频也可以因为用不到那么快的速度。 时序图中空闲状态下CLK是低电平第一个上升沿将D15读入
SPI_CPOL_Low和SPI_CPHA_1Edge
在时序图中先到达的是D15也就是高位。 主机数据的发送顺序也应是先发送高位配置为SPI_FirstBit_MSB。 SPI_CRCPolynomial填写的是CRC校验公示的因子设置为随机正数。 SPI_NSS设置由硬件控制还是软件控制。在此设置为软件据课程老师说更常用。 发送数据 这是SPI部分看上去跟之前写的USART没有什么区别。
void SPI1_WriteByte(uint8_t TxData)
{while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) RESET);SPI_I2S_SendData(SPI1,TxData);
}MAX7219部分
上面只是SPI方面的配置和使用。SPI是通信协议我们要通过这个协议来告诉从机改干什么。 最开始有提到过但从未使用的CS现在有用了在需要通信时拉低告诉从机传输要开始了。 需要先初始化相关的引脚
void MAX7219_CS_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
利用位带修改引脚的值。
void Write_MAX7219(uint8_t addr,uint8_t data)
{PAout(4) 0;SPI1_WriteByte(addr);SPI1_WriteByte(data);Delay_ms(1);PAout(4) 1;
}写完数据从机未必成功读完需要给从机一点时间响应。 写成发送两次8字节是因为这样更加直观。 设置显示选项 点阵屏的亮度、开关也可以设置。 在板载的硬件中可以通过stm32提供的库函数修改。 在这种外设条件下主机和从机之间的联系方式只有目前的SPI。 通过SPI发送2字节数据第一个字节指定地址第二个字节指定该地址填入的数据。 各内部功能寄存器含义如下
停机寄存器地址0CH当D00时MAX721处于停机状态当D01时处于正常工作状态。显示测试寄存器地址0FH当D00时MAX7219按设定模式正常工作当D01时处于测试状态。在该状态下不管MAX7219处于什么模式全部LED将按最大亮度显示。亮度寄存器地址0AH亮度可以用硬件和软件两种方法调节。亮度寄存器中的D0D3位可以控制LED显示器的亮度。扫描界限寄存器地址0BH该寄存器中D0D3位数据设定值为07H设定值表示显示器动态扫描个数位18。译码方式寄存器地址09H该寄存器的8位二进制数的各位分别控制8个LED显示器的译码方式。当高电平时选择BCD-B译码模式当低电平时选择不译码模式即送来数据为字型码。内部RAM地址0108H分别对应于DIG0DIG7。
也就是说通过SPI协议向指定的位置写值实现修改设置和数据。
void MAX7219_Init()
{SPI1_Init();MAX7219_CS_Init();Write_MAX7219(0x0C,0x01);Write_MAX7219(0x0F,0x00);Write_MAX7219(0x0A,0x0f);Write_MAX7219(0x0B,0x07);Write_MAX7219(0x09,0x00);
}对照上面的寄存器含义该代码的含义为
停机寄存器正常工作状态测试寄存器按设定正常工作亮度寄存器最大亮度显示扫描界限寄存器显示到第8列即全部显示译码方式寄存器不译码送来什么就显示什么 主函数显示笑脸 不同于点亮数码管。点亮数码管需要快速刷新在一个瞬间只能点亮一个数字。停止刷新就不再显示。 该点阵屏的点亮是通过往寄存器写值刷新显示操作交由外设硬件。只要寄存器值不变现实的内容就不变 。我们只需要写一次数据即可。
uint8_t smile[8] {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};
int main(void)
{MAX7219_Init();uint8_t i 0;for(i 1; i 8; i){Write_MAX7219(i,smile[i-1]);}while(1){}
} 参考
MAX7219点阵原理图.pdfMAX7219中文.pdfMAX7219原理及其应用.pdfstm32 使用说明笔记(必读.pdf32版开发板原理图.pdf