4402|0

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MXCHIP使用心得+(3)MX1081使用SPI驱动HC595的LED灯带 [复制链接]



MX1081使用SPI驱动HC595LED灯带
HC595芯片是一个8bit串行输入,并行输出的驱动芯片。广泛引用于LED、数码管等驱动。对于单色LED灯条驱动而言,成本低而且PCB面积小,非常适合灯条的应用。
1、HC595的电路设计和驱动时序
根据HC595datasheet,其驱动电路主要是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在SHcp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在STcp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
因此,设计采用SPI来驱动HC595,同时两片595(可以更多)相互级联,形成整个LED灯条。
电路图设计如下。使用第一个HC595NQH来驱动下一个HC595SER
2MX1081SPI驱动
使用STMCube,加入SPI功能如下。并配置SPI引脚和初始化设置如下。其中比较关键的是CPOLCPHA
代码如下图:
/* 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 */

运行效果图:

此帖出自RF/无线论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表