STM32CUBEMX(14)--SPI,TLC5947外部PWM移植

发布时间:2024-06-06  

概述

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如 EEPROM,FLASH,实时时钟,AD转换器。 TLC5947是一款SPI接口的PWM脉宽调制24路LED驱动模块/RGB LED驱动器芯片,它能驱动24路的PWM。

硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:

在这里插入图片描述

外部PWM模块就是淘宝上SPI接口的TLC5947模块。在这里插入图片描述

选择芯片型号

使用STM32CUBEMX选择芯片stm32f030r8,如下所示:在这里插入图片描述

配置时钟源

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可:在这里插入图片描述

SPI配置

本次实验使用的SPI与Flash通信,配置如下。 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,从设备使能信号,由主设备控制。

接线方式

在这里插入图片描述

负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。 时钟信号线SCLK只能由主设备控制,从设备不能控制。同样,在一个基于SPI的设备中,至少有一个主设备。这样的传输方式有一个优点,在数据位的传输过程中可以暂停,也就是时钟的周期可以为不等宽,因为时钟线由主设备控制,当没有时钟跳变时,从设备不采集或传送数据。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。芯片集成的SPI串行同步时钟极性和相位可以通过寄存器配置,IO模拟的SPI串行同步时钟需要根据从设备支持的时钟极性和相位来通讯。 最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。在这里插入图片描述其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。 TLC5947需要配置2个CS线,分别是BLANK和LAT。在这里插入图片描述

生成工程设置

注意在生产工程设置中不能出现中文,不然会报错。

在这里插入图片描述

生成代码

在这里插入图片描述

配置keil

在这里插入图片描述

TLC5947的原理及应用

BLANK:所有恒流输出关闭。 当blank 接高时 ,所有恒流输出(输出0通过out23)强制关闭,脉宽调制PWM定时控制器初始化,灰度计数器重置为0。 当blank接低时 ,所有恒流输出由灰度脉宽调制定时控制器控制。 GND:负极 IREF:设置恒定电流值,设置T0到T23引脚输出的电流值。通过在IREF和GND之间连接一个外部电阻所需要的值。 SCLK:串行数据移位时钟。 SIN:灰度数据的串行输入。 SOUT:串行数据输出。 VCC:供电 XLAT:灰度数据转换。灰度移位寄存器中的数据以从低到高的方式移动到灰度数据锁存器,在XLAT引脚上转换。当XLAT.上升沿被输入时,所有恒流输出被强制关闭,直到下一个灰度显示周期。灰度计数器不会随着XLAT边沿的上升而重置为0。在这里插入图片描述由于芯片为开漏输出,故接线如下所示。在这里插入图片描述时序图如下所示。在这里插入图片描述

代码

本例程向通道0中写入呼吸灯程序通道1输出12.5%,通道2输出25%,通道3-通道22输出50%,通道23输出75%,例程代码如下。 变量定义。


/* USER CODE BEGIN PV */

uint16_t leds[24]= 

{

512,512,1024,2048,2048,2048,

2048,2048,2048,2048,2048,2048,

2048,2048,2048,2048,2048,2048,

2048,2048,3000,2048,2048,3072

};

void TLC_Update(void);

void TLC_Write(uint8_t data);

int i=0;

int flag=0;

/* USER CODE END PV */

SPI发送函数定义。


/* USER CODE BEGIN 4 */

void TLC_Update(void)

{       

    HAL_GPIO_WritePin(BLANK_GPIO_Port, BLANK_Pin, GPIO_PIN_SET);

//        HAL_Delay(1);    

    for (int8_t i = 23; i >= 0; i -= 2)

    {

        uint8_t send1 = 0;

        uint8_t send = leds[i] >> 4;

        TLC_Write(send);

        send = (leds[i] & 0x000F);

        send <<= 4;

        send1 = (leds[i-1]) >> 8;    

        send |= send1;

        TLC_Write(send);

        send = leds[i-1];

        TLC_Write(send);

    }    


    HAL_GPIO_WritePin(XLAT_GPIO_Port, XLAT_Pin, GPIO_PIN_SET);

//        HAL_Delay(1);    

    HAL_GPIO_WritePin(XLAT_GPIO_Port, XLAT_Pin, GPIO_PIN_RESET);

//        HAL_Delay(1);    

    HAL_GPIO_WritePin(BLANK_GPIO_Port, BLANK_Pin, GPIO_PIN_RESET);


    return ;

}



void TLC_Write(uint8_t data)

{

    HAL_SPI_Transmit(&hspi1, &data, sizeof(data), 0);

    while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_RESET);


    return ;

}

/* USER CODE END 4 */

主程序。


/* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

        if(flag==0)//灯渐亮

                i+=5;

        else//灯渐灭

                i-=5;


        if(flag==0&&i==4095)//灯最亮

        {

            HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);

            flag=1;

        }

        if(flag==1&&i==0)//灯最暗

        {

            HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

            flag=0;

        }            

        leds[0]=i;//更新通道0的PWM

        TLC_Update();//更新PWM

        HAL_Delay(1);        

  }

  /* USER CODE END 3 */



}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>