This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TLC4541: stm32f103zet6读取tlc4541的采样值出错

Part Number: TLC4541

STM32F103ZET6目前读取AD转换的结果不正常,输出值总是恒定在某几个值上面(1,3,7,15,31,63,127,255,510,1020,2040,4080,8160,16320,32767..........),但是数值并不是随机变化,跟输入电压有一定关系,例如,输入电压从2V变化到2.5V时都是16320,输出数据都一样,可能要一直等到输入电压大于4v后才改变输出数据为32767。同样的程序在其他板子的现象是:在STM32F103C8T6读的数据就是正确的,在一块STM32F103ZET6学习板上读取数据不正常,但是只要将CS,SDO引出接入示波器数据就正确了。以下是代码,电路图和TLC4541手册。请大家帮忙分析一下原因和解决方法,谢谢。

#define A0_Pin            GPIO_Pin_4
#define A0_GPIO_Port      GPIOB

#define A1_Pin            GPIO_Pin_5
#define A1_GPIO_Port      GPIOB

#define A2_Pin            GPIO_Pin_8
#define A2_GPIO_Port      GPIOB

#define Z_Pin             GPIO_Pin_9
#define Z_GPIO_Port       GPIOB

#define AD_CS_Pin         GPIO_Pin_3
#define AD_CS_GPIO_Port   GPIOB

#define AD_SDO_Pin        GPIO_Pin_15
#define AD_SDO_GPIO_Port  GPIOG

#define SCLK_Pin          GPIO_Pin_14
#define SCLK_GPIO_Port    GPIOG


/*===============================================================
   相关引脚配置:A0,A1,A2,Z控制增益,
	入口参数:无
	返回参数:无
===============================================================*/
																
void tlc4541_IOInit()
{ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG,ENABLE);	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //将PB3,PB4配置为普通GPIO
	GPIO_InitTypeDef   GPIO_InitStructure;

	//A0
	GPIO_InitStructure.GPIO_Pin = A0_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(A0_GPIO_Port,  &GPIO_InitStructure);
	GPIO_WriteBit(A0_GPIO_Port, A0_Pin, Bit_RESET);//初始化为低电平
	//A1
	GPIO_InitStructure.GPIO_Pin = A1_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(A1_GPIO_Port, &GPIO_InitStructure);
	GPIO_WriteBit(A1_GPIO_Port, A1_Pin, Bit_RESET);//初始化为低电平
	
	//A2
	GPIO_InitStructure.GPIO_Pin = A2_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(A2_GPIO_Port, &GPIO_InitStructure);
	GPIO_WriteBit(A2_GPIO_Port, A2_Pin, Bit_RESET);;//初始化为低电平	
	
	//CS片选
	GPIO_InitStructure.GPIO_Pin = AD_CS_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(AD_CS_GPIO_Port, &GPIO_InitStructure);
	GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_SET);//初始化为高电平		
	
	//Sdo数据
	GPIO_InitStructure.GPIO_Pin = AD_SDO_Pin;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
	GPIO_Init(AD_SDO_GPIO_Port, &GPIO_InitStructure);

	//Sclk时钟
	GPIO_InitStructure.GPIO_Pin = SCLK_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(SCLK_GPIO_Port, &GPIO_InitStructure);
	GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);//初始化为低电平

}																
																
/*===============================================================
    读SDO引脚的值
	入口参数:无
	返回参数:无
===============================================================*/
uint8_t Get_AD_value(void)
{
	return GPIO_ReadInputDataBit(AD_SDO_GPIO_Port, AD_SDO_Pin);
}

/*===============================================================
    AD初始化
	入口参数:无
	返回参数:无
===============================================================*/
void tlc4541_init()
{
  uint8_t i = 0;
	GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_RESET);
	
	for(i=0; i<6; i++) 
	{
		GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_SET);
		delay_us(1);
		GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);
  	delay_us(1);
	}

	GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_SET);
}


/*===============================================================
   AD初始化判断
	入口参数:无
	返回参数:AD初始化标志,
===============================================================*/
uint8_t tlc4541_start(void)
{
	tlc4541_init();
	if (tlc4541_get() == 0xFF00)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

/*
* 函数名:tlc4541_get
* 输入参数:
* 输出参数:无
* 返回值:读到的数据
* 函数作用:模拟 SPI 读16位数值
*/
uint16_t tlc4541_get(void) 
{
		volatile uint16_t result0 = 0x0000;
		volatile uint8_t i = 0;
		volatile uint16_t temp = 0;
		GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin,  Bit_RESET);
		//开始读取16数据
		for(i=0; i<16; i++) {
			GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_SET);
			result0 <<= 1;
			delay_us(1);
			GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);
			temp = (uint32_t)Get_AD_value();
			result0 |= ( (temp) & 0x0001 );
			delay_us(1);
		}
        //转换时间
		for( i=0; i<8; i++ )
		{
			GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_SET);
			delay_us(2);
			GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);
			delay_us(2);
		}
		//周期结束复位
		GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_SET);
		
		return result0;
}
  ourdev_518088.pdfourdev_518089.doc