打印

求助一个stm32 usb的ad采集

[复制链接]
3240|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gurong60|  楼主 | 2013-6-24 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gurong60 于 2013-6-24 16:48 编辑

现在是用spi接口的adc来采集电压,
使用usb——vcp的例程来改成自定义bluck传输。stm32作为从机,电脑接收数据
采用定时器中断100khZ来作为adc的采样率,
spi设置分频为9M.
stm32发送spi命令等待时间大概1.5us,
这样采集的数据送到usb导致usb没有响应,
但如果把spi发送命令中等待屏蔽去除,就可以传送usb数据,当然传送的数据是有误的
请问是为什么,是不是影响到usb中断了?

spi发送数据
u16 SPIx_ReadWriteByte(u16 TxData)
{
//        u8 retry=0;
//        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位
//        {
//                retry++;
//                if(retry>200)return 0;
//        }
        SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
//        retry=0;
//        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
//        {
//                retry++;
//                if(retry>200)return 0;
//        }
        return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}

主程序:
int main(void)
{
                                                                                                                                       
        SystemInit();
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO, ENABLE);                                                                                                        // 初始化时钟系统、使能相关的外围设备电源
        Set_USBClock();
        
        LED_config();                                                                                                    // 配置USB所用到的中断
        USB_Interrupts_Config();                                                                                                // 配置和使能USB时钟
        USB_Init();                                                                                                                        
        SPI_AD_Init();
        USART1_Config();
        TIM5_Interrupts_Config();
        TIM5_Init();        

        while (1)
        {
               
                        
                //        adc_out1[2]=(adc_out[1]>>8)&0x00ff;
                //        adc_out1[3]=adc_out[1]&0x00ff;

/*                while(1)
{
                USART_SendData(USART1,adc_out1[0]);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){}
                USART_SendData(USART1,adc_out1[1]);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){}
                USART_SendData(USART1,adc_out1[2]);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){}
                Delayms(2000);
                Delayms(2000);
                Delayms(2000);
                Delayms(2000);
                Delayms(2000);
                Delayms(2000);
  }

  */

                if ((count_out != 0) && (bDeviceState == CONFIGURED))
                {        
                        while(1)
                        {                                                                                
                                USB_SIL_Write(EP1_IN, adc_out1,64);                                
                                
                        }
                        count_out==0 ;
                }
        }
}


void TIM5_Interrupts_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        

        


        /* Enable the TIM5 gloabal Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* Function Name  : USB_Interrupts_Config
* Description    : Configures the USB interrupts
* Input          : None.
* Return         : None.
*******************************************************************************/
void USB_Interrupts_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        #ifdef STM32F10X_CL
                /* Enable the USB Interrupts */
                NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
        #else
                NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
        #endif /* STM32F10X_CL */
        



}

沙发
gurong60|  楼主 | 2013-6-24 15:29 | 只看该作者
顶起

使用特权

评论回复
板凳
mmuuss586| | 2013-6-24 15:49 | 只看该作者

使用特权

评论回复
地板
香水城| | 2013-6-24 16:01 | 只看该作者
LZ能否把问题描述的清楚一些?

通过SPI读取外部ADC采样数据,然后通过USB接口发送出去?USB作为主机还是从机?什么叫做USB没有响应?你是如何操作USB的?使用ST的库还是自己操作寄存器?如果是ST的库,又是基于哪个demo?

SPI发送读取命令,应该在下一帧通过发送dummy数据来把ADC的数据读取回来。你这个1.5us的“发送spi命令等待时间”是指什么?

使用特权

评论回复
5
gurong60|  楼主 | 2013-6-24 16:49 | 只看该作者
/****************************************************************
* Function Name : SPI_FLASH_Init
* Description : Initializes the peripherals used by the SPI FLASH driver.
* Input : None
* Output : None
* Return : None
*******************************************************************/
void SPI_AD_Init(void)
{
        SPI_InitTypeDef SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* Enable SPI1 and GPIO clocks */
        /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
        SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
         and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);
       
        /*!< SPI_FLASH_SPI Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
        /*!< AFIO Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
        /*!< Configure SPI_FLASH_SPI pins: SCK */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /*!< Configure SPI_FLASH_SPI pins: MISO */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /*!< Configure SPI_FLASH_SPI pins: MOSI */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Deselect the FLASH: Chip Select high */
//        SPI_FLASH_CS_HIGH();
       
        /* SPI1 configuration */
        // W25X16: data input on the DIO pin is sampled on the rising edge of the CLK.
        // Data on the DO and DIO pins are clocked out on the falling edge of CLK.
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1, &SPI_InitStructure);
       
        /* Enable SPI1 */
        SPI_Cmd(SPI1, ENABLE);

}

使用特权

评论回复
6
gurong60|  楼主 | 2013-6-24 16:49 | 只看该作者
定时器中断

void TIM5_IRQHandler(void)
{

        if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
                adc_out[0]=SPIx_ReadWriteByte(0x8000);
        
                adc_out[1]=SPIx_ReadWriteByte(0x0000);
                adc_out1[0]=(adc_out[0]>>4)&0x00ff;
                adc_out1[1]=((adc_out[0]<<4)+(adc_out[1]>>12))&0x00ff;



        }
}

使用特权

评论回复
7
书的那页| | 2013-10-30 15:20 | 只看该作者
你好楼主,我近期也在做usb数据传输,但是在数据分离上出了点问题,就是,我把ad=readad(0),但到后来的数据分离,以及发给上位机就不是很明白,不知可以发个例程,学习下,谢!;

使用特权

评论回复
8
书的那页| | 2013-10-31 10:31 | 只看该作者
香水城 发表于 2013-6-24 16:01
LZ能否把问题描述的清楚一些?

通过SPI读取外部ADC采样数据,然后通过USB接口发送出去?USB作为主机还是从 ...

香主,你好,近期正学usb通信,现在打算自己做上位机,请教用那些工具?只用mfc够吗?现在仅仅是采用枚举的方式通信

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:对手,队友

179

主题

1307

帖子

4

粉丝