打印
[应用相关]

基于STM32的TLC2543驱动程序

[复制链接]
2076|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yiyigirl2014|  楼主 | 2018-3-17 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这个驱动程序是基于3.0固件库来写的,所以具体的配置都很明确,需要注意两点:

1、读写速度不能太高,否则会读取不到数据。

2、注意数据的读取方式,TLC2543有8位、12位、16位三种数据方式,这里快使用16位。

其他的配置完全按照datasheet中的时序图来,配置的时候仔细核对一下就可以了。

void TLC2543_Config(void)
{
        SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        /* PA5-SCK PA7-MOSI */
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5 |GPIO_Pin_7 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        /*PA4-CS*/
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);       

        /*PA6-MISO*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* SPI1 configuration 具体的SPI时序严格参照TLC2543数据手册*/
        SPI_Cmd(SPI1, DISABLE);                                                                                                 //必须先禁能,才能改变MODE
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;                //两线全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                        //主
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                                                //16位
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                                                                //时钟脚空闲时保持低电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                        //在第一个时钟沿采样数据信号
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                //软件NSS,片选信号由软件产生
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //256分频
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                //高位在前
   
        SPI_Init(SPI1, &SPI_InitStructure);
    SPI_Cmd(SPI1, ENABLE);
}
u16 Read_TLC2543(u16 chan)
{
        u16 i,ADCdata;
        chan <<=12;
        chan|=0x0C00;
        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);                                                         //拉低CS引脚电平
        for(i=0;i<500;i++);                                                                                                     //加入延时,速度过快则读不到数据
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPI1,chan);                                                                                        //写入一个数据,包括采样通道和数据格式  
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET) ;  
        ADCdata=SPI_I2S_ReceiveData(SPI1);
        for(i=0;i<500;i++);
        ADCdata>>=4;                                                                                                                        //读取的数据为16位,低四位为0
        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);                                                                 //CS高
       
        //在多通道采样时,当前读取的数据时上一次选择的通道值,如果在速度要求不高的情况下可以进行两次操作
        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);                                                         //拉低CS引脚电平
        for(i=0;i<500;i++);                                                                                                     //加入延时,速度过快则读不到数据
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPI1,chan);                                                                                        //写入一个数据,包括采样通道和数据格式  
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET) ;  
        ADCdata=SPI_I2S_ReceiveData(SPI1);
        for(i=0;i<500;i++);
        ADCdata>>=4;                                                                                                                        //读取的数据为16位,低四位为0
        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
        return ADCdata;
}


沙发
yiyigirl2014|  楼主 | 2018-3-17 09:42 | 只看该作者
其实这个接口类似SPI,可以通过IO很容易模拟出来。

使用特权

评论回复
板凳
mmuuss586| | 2018-3-17 09:48 | 只看该作者
先IO模拟测试呗,再改成硬件SPI的

使用特权

评论回复
地板
yiyigirl2014|  楼主 | 2018-3-17 10:42 | 只看该作者
mmuuss586 发表于 2018-3-17 09:48
先IO模拟测试呗,再改成硬件SPI的

好主意

使用特权

评论回复
5
小灵通2018| | 2018-3-17 15:55 | 只看该作者
不过32模拟接口,不好操作。

使用特权

评论回复
6
zhuotuzi| | 2018-3-17 18:24 | 只看该作者
如果用IO操作,其实不用搞这么多套路,直接最多两个函数,一个初始化,一个读。

使用特权

评论回复
7
zhuotuzi| | 2018-3-17 18:24 | 只看该作者
如果用IO操作,其实不用搞这么多套路,直接最多两个函数,一个初始化,一个读。

使用特权

评论回复
8
643757107| | 2018-3-17 22:58 | 只看该作者
搞清楚时序就行了。

使用特权

评论回复
9
xuanhuanzi| | 2018-3-18 15:57 | 只看该作者
32自带的有ADC了,可以用内置的。

使用特权

评论回复
10
Iamarabbit| | 2018-9-1 13:26 | 只看该作者
完全按照这个走的,为什么采不到数?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3545

帖子

10

粉丝