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_PinGPIO_Pin_4 #define A0_GPIO_PortGPIOB #define A1_PinGPIO_Pin_5 #define A1_GPIO_PortGPIOB #define A2_PinGPIO_Pin_8 #define A2_GPIO_PortGPIOB #define Z_PinGPIO_Pin_9 #define Z_GPIO_PortGPIOB #define AD_CS_PinGPIO_Pin_3 #define AD_CS_GPIO_PortGPIOB #define AD_SDO_PinGPIO_Pin_15 #define AD_SDO_GPIO_Port GPIOG #define SCLK_PinGPIO_Pin_14 #define SCLK_GPIO_PortGPIOG /*===============================================================相关引脚配置: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_InitTypeDefGPIO_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
Kailyn Chen:
感谢您对TI产品的关注!为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上(https://e2e.ti.com/support/data-converters-group/),将由资深的英文论坛工程师为您提供帮助。
,
yuan manna:
有人碰到过这个想象吗?可以提供些帮助吗?
,
Kailyn Chen:
您好,您可以将您的这个问题提交到英文E2E上,由资深工程师为您解答。