STM32F103C8T6用中断采集AD677的16位数字信号,采的是2V基准电压,采出的值在0.5和3之间来回跳。
AD677的参考电压是5V,AD677采样时序如下
串口助手得到的数如下,我用fb判断busy是否为高,用fa判断busy是否为低,所以fb和fa之间的数就是采出来的数

我用外部中断检测SCLK的上升沿,检测到上升沿就进入中断,把sdata的值赋给data,采完16位通过usart发到上位机,以下是代码
#define SAMPLE_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define SAMPLE_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define CLK_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_6)
#define CLK_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_6)
#define CAL_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_7)
#define CAL_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_7)
#define READ_SDATA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define READ_BUSY() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)
#define READ_SCLK() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)
#define READ_CLK() GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6)
#define ResetCOUNTER() TIM_SetCounter(TIM3, 0)
volatile uint16_t data = 0;
volatile uint8_t bitCounter = 0;
volatile uint8_t dataReady = 0;
void GPIO_ENABLE(uint32_t RCC_APB2Periph, GPIO_TypeDef* GPIOx, GPIOMode_TypeDef GPIO_Mode, uint16_t GPIO_Pin, GPIOSpeed_TypeDef GPIO_Speed)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
void AD_Init(void)
{
GPIO_ENABLE(RCC_APB2Periph_GPIOA, GPIOA, GPIO_Mode_AF_PP, GPIO_Pin_6, GPIO_Speed_50MHz);
GPIO_ENABLE(RCC_APB2Periph_GPIOA, GPIOA, GPIO_Mode_Out_PP, GPIO_Pin_4 | GPIO_Pin_7, GPIO_Speed_50MHz);
GPIO_ENABLE(RCC_APB2Periph_GPIOA, GPIOA, GPIO_Mode_IN_FLOATING, GPIO_Pin_8, GPIO_Speed_50MHz);
GPIO_ENABLE(RCC_APB2Periph_GPIOB, GPIOB, GPIO_Mode_IN_FLOATING, GPIO_Pin_10 | GPIO_Pin_11, GPIO_Speed_50MHz);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 4 - 1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 500;
TIM_OC1Init(TIM3, &TIM_OCInitStruct);
}
void PB10EXTI_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line10;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI15_10_IRQHandler(void)
{
int8_t temp;
if(EXTI_GetITStatus(EXTI_Line10) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line10);
if(bitCounter < 16)
{
data = (data << 1) | READ_SDATA();
bitCounter++;
if(bitCounter == 16)
{
dataReady = 1;
bitCounter = 0;
if(dataReady == 1)
{
temp = (data >> 8) & 0xFF;
Serial_SendByte(temp);
temp = (data & 0xFF);
Serial_SendByte(temp);
dataReady = 0;
}
}
}
}
}