MX1081使用SPI驱动HC595的LED灯带
HC595芯片是一个8bit串行输入,并行输出的驱动芯片。广泛引用于LED、数码管等驱动。对于单色LED灯条驱动而言,成本低而且PCB面积小,非常适合灯条的应用。
1、HC595的电路设计和驱动时序
根据HC595的datasheet,其驱动电路主要是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在SHcp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在STcp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
因此,设计采用SPI来驱动HC595,同时两片595(可以更多)相互级联,形成整个LED灯条。
电路图设计如下。使用第一个HC595的NQH来驱动下一个HC595的SER。
2、MX1081的SPI驱动
使用STMCube,加入SPI功能如下。并配置SPI引脚和初始化设置如下。其中比较关键的是CPOL和CPHA。
代码如下图:
/* USER CODE BEGIN 0 */
static uint8_t color_data[] = {0x5E, 0xFE, 0x0F, 0xF0};
const static int LED_COUNTS = sizeof(color_data)/sizeof(uint8_t);
void Reset_HC595(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, color_data, 1, 0);
__NOP();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
}
void Set_HC595(void) {
Reset_HC595();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi1, color_data, LED_COUNTS, 0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
}
/* USER CODE END 0 */
while (1)
{
Reset_HC595();
HAL_Delay(1000);
color_data[0] = 0xF0;
color_data[1] = 0x0F;
Set_HC595();
HAL_Delay(1000);
for(int i = 0; i < 256; i++) {
color_data[0] = 255 - i;
color_data[1] = i;
Set_HC595();
HAL_Delay(10);
}
HAL_Delay(1000);
}
/* USER CODE END 3 */
运行效果图: