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