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) { vola
tile 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,