[应用相关] 基于STM32的TLC2543驱动程序

[复制链接]
2799|9
 楼主| yiyigirl2014 发表于 2018-3-17 09:42 | 显示全部楼层 |阅读模式

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

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

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

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

  1. void TLC2543_Config(void)
  2. {
  3.         SPI_InitTypeDef  SPI_InitStructure;
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  7.        
  8.         /* PA5-SCK PA7-MOSI */
  9.     GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5 |GPIO_Pin_7 ;
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  13.         /*PA4-CS*/
  14.         GPIO_SetBits(GPIOA, GPIO_Pin_4);
  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);       

  19.         /*PA6-MISO*/
  20.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  23.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  24.     /* SPI1 configuration 具体的SPI时序严格参照TLC2543数据手册*/
  25.         SPI_Cmd(SPI1, DISABLE);                                                                                                 //必须先禁能,才能改变MODE
  26.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;                //两线全双工
  27.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                        //主
  28.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                                                //16位
  29.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                                                                //时钟脚空闲时保持低电平
  30.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                        //在第一个时钟沿采样数据信号
  31.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                //软件NSS,片选信号由软件产生
  32.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //256分频
  33.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                //高位在前
  34.    
  35.         SPI_Init(SPI1, &SPI_InitStructure);
  36.     SPI_Cmd(SPI1, ENABLE);
  37. }
  38. u16 Read_TLC2543(u16 chan)
  39. {
  40.         u16 i,ADCdata;
  41.         chan <<=12;
  42.         chan|=0x0C00;
  43.         GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);                                                         //拉低CS引脚电平
  44.         for(i=0;i<500;i++);                                                                                                     //加入延时,速度过快则读不到数据
  45.         while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);
  46.         SPI_I2S_SendData(SPI1,chan);                                                                                        //写入一个数据,包括采样通道和数据格式  
  47.         while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET) ;  
  48.         ADCdata=SPI_I2S_ReceiveData(SPI1);
  49.         for(i=0;i<500;i++);
  50.         ADCdata>>=4;                                                                                                                        //读取的数据为16位,低四位为0
  51.         GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);                                                                 //CS高
  52.        
  53.         //在多通道采样时,当前读取的数据时上一次选择的通道值,如果在速度要求不高的情况下可以进行两次操作
  54.         GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);                                                         //拉低CS引脚电平
  55.         for(i=0;i<500;i++);                                                                                                     //加入延时,速度过快则读不到数据
  56.         while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);
  57.         SPI_I2S_SendData(SPI1,chan);                                                                                        //写入一个数据,包括采样通道和数据格式  
  58.         while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET) ;  
  59.         ADCdata=SPI_I2S_ReceiveData(SPI1);
  60.         for(i=0;i<500;i++);
  61.         ADCdata>>=4;                                                                                                                        //读取的数据为16位,低四位为0
  62.         GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
  63.         return ADCdata;
  64. }


 楼主| 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的

好主意
小灵通2018 发表于 2018-3-17 15:55 | 显示全部楼层
不过32模拟接口,不好操作。
zhuotuzi 发表于 2018-3-17 18:24 | 显示全部楼层
如果用IO操作,其实不用搞这么多套路,直接最多两个函数,一个初始化,一个读。
zhuotuzi 发表于 2018-3-17 18:24 | 显示全部楼层
如果用IO操作,其实不用搞这么多套路,直接最多两个函数,一个初始化,一个读。
643757107 发表于 2018-3-17 22:58 | 显示全部楼层
搞清楚时序就行了。
xuanhuanzi 发表于 2018-3-18 15:57 | 显示全部楼层
32自带的有ADC了,可以用内置的。
Iamarabbit 发表于 2018-9-1 13:26 | 显示全部楼层
完全按照这个走的,为什么采不到数?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

3676

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部