TLC549与STM32通信实验

TLC549与STM32通信实验

系统框图

TLC549与STM32通信实验_第1张图片

接口板设计

TLC549

TLC549与STM32通信实验_第2张图片

管脚定义

TLC549与STM32通信实验_第3张图片

原理图

TLC549与STM32通信实验_第4张图片

通信时序

可以看到,时序很简单。只需要给出时钟信号,然后读取返回数据即可。
TLC549与STM32通信实验_第5张图片

STM32通信程序
uint8_t Get_549_Data(void)
{
	uint8_t temp = 0x00;
	CS = 1;
	CLOCK = 0;
	CS = 0;
	delay_us(2);
	for(int i = 0; i < 8; i++){
		temp <<= 1;
		temp |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);
		CLOCK = 1; 
		delay_us(1);
		CLOCK = 0;
	}
	delay_us(20);
	CS = 1;
	return temp;
}

LED电路设计

直接用单片机输出推LED
TLC549与STM32通信实验_第6张图片
或者用这种设计:
TLC549与STM32通信实验_第7张图片

实物图

开发板

STM32F407探索者开发板

STM32程序

LCD部分大同小异,故忽略

外设

初始化STM32与TLC549通信管脚
void TLC539_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;

  	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_9;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOC,GPIO_Pin_9);
	GPIO_ResetBits(GPIOC,GPIO_Pin_7);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
}

其中,

#define CLOCK PCout(7)
#define CS PCout(9)
LED管脚
void LED_OUT_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);
	
	
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_4 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7 ;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_4 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7);
}
亮灯选择
void LED_Light(int i, int is_light){
	switch (i){
		case 0:
			if(is_light) LEDA=1;
			else LEDA=0;
			break;
		case 1:
			if(is_light) LEDC=1;
			else LEDC=0;
			break;
		case 2:
			if(is_light) LEDE=1;
			else LEDE=0;
			break;
		case 3:
			if(is_light) LEDG=1;
			else LEDG=0;
			break;
		case 4:
			if(is_light) LEDI=1;
			else LEDI=0;
			break;
		case 5:
			if(is_light) LEDK=1;
			else LEDK=0;
			break;
		case 6:
			if(is_light) LEDM=1;
			else LEDM=0;
			break;
		case 7:
			if(is_light) LEDO=1;
			else LEDO=0;
			break;
		default: break;
	}
}

主程序

主要部分

uint8_t ttt=0x00;
while(1)
	{
		ttt = Get_549_Data();
		real_549 = (4.87-0.00)/256.0*ttt;
		
		if(!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)) {
			for(int i = 0; i<8;i++){
				if(ttt&0x80) LED_Light(i,1);
				else LED_Light(i,0);
				ttt=ttt<<1;
			}
		}
		delay_ms(250);	
	}

最后


你可能感兴趣的:(电子电路)