辰风已久 2024-07-10 16:24 采纳率: 0%
浏览 5

OV7670通过串口上传数据失败

void OV7670_SendPic(void)
{
vu16 a=0,b=0;

    while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);        //等待OV7670帧同步信号
    GPIO_WriteBit(GPIOC, GPIO_Pin_5, Bit_RESET);    //FIFO写指针复位
    GPIO_WriteBit(GPIOC, GPIO_Pin_5, Bit_SET);    //
    GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_SET);        //FIFO写使能
    while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);  //等待第二个帧同步信号
    while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);  //
    GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_RESET); //FIFO写禁止
   
    FIFO_Reset_Read_Addr(); //FIFO 读数据复位,通过直接操作寄存器来提高速度,读取FIFO中的数据

   
    Serial_SendByte(0x01);//调试工具要求在发送图像数据之前要发0x01和0xFE
    Serial_SendByte(0xFE);
   
    for (a=0;a<240;a++)
    {
            for(b=0;b<320;b++)
            {
                    GPIOC->BRR =1<<4;  //PC5 - FIFO_WRST写复位
                    AA=GPIOA->IDR;           //读取第一个像素高字节                               
                    GPIOC->BSRR =1<<4; //PC5 - FIFO_WRST写使能
                   
                    GPIOC->BRR =1<<4;  //PC5 - FIFO_WRST写复位
                    BB=GPIOA->IDR&0x00ff;        //读取第一个像素低字节                                                       
                    GPIOC->BSRR =1<<4;       
                   
                   
                    // 发送数据,上位机要选择大端。
                    Serial_SendByte(AA);
                    Serial_SendByte(BB);
                   
            }                                                       
    }
    Serial_SendByte(0xFE);//调试工具要求在发送图像数据之后要发0xFE和0x01
    Serial_SendByte(0x01);
   
    //OLED_ShowString(1,1,"SUCCESS");
    OV7670_State=0;//这个变量详查OV7670_FIFOGetPic(函数)

}
这个是发送数据到电脑的代码。
void Serial_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX PA9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RX PA10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &USART_InitStructure);
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
   
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
   
    USART_Cmd(USART1, ENABLE);

}
这个是串口的初始化。
int main()
{
OV7670_Init();
Serial_Init();/* 波特率115200(在SYSCLOCK为72MHz时正常传输)*/

    while(1)
    {
            OV7670_FIFOGetPic();
            Delay_s(10);
            OV7670_FIFOGetPic();//第二次FIFO读取使FIFO读失能
            Delay_s(2);
            OV7670_SendPic();
            Delay_ms(500);
    }

}

这是主函数。
请问有什么错误吗?求解!
用山外接收,一直没有图片。
用SSCOM接收串口信息也接收不到。

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2024-07-10 16:24
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您好!针对您提供的问题,我们可以从几个方面来检查和解决 OV7670 摄像头通过 STM32 串口上传数据失败的问题:

    1. 帧同步信号的等待和处理

      • 确保 GPIO_ReadInputDataBit 函数正确读取了 OV7670 的帧同步信号。如果信号读取不正确,可能导致数据发送的时机错误。
    2. FIFO 写指针复位和写使能的逻辑

      • 检查 GPIO_WriteBit 函数调用是否正确设置 GPIO 引脚,以及是否正确地复位和使能了 FIFO 写指针。
    3. 像素数据的读取和发送逻辑

      • 确保 AABB 变量正确地存储了像素数据的高字节和低字节。
      • 检查 Serial_SendByte 函数是否能够正确发送数据。注意,发送数据前发送 0x010xFE 可能是某种协议的要求,确保这些数据也正确发送。
    4. 串口初始化设置

      • 确认 Serial_Init 函数中的波特率设置是否与接收端(如电脑的串口调试工具)一致。
      • 检查硬件流控制、模式、校验位、停止位和数据位的设置是否符合通信要求。
    5. 中断配置和 NVIC 设置

      • 确保中断使能了 USART1 的接收中断,并且 NVIC 的优先级设置正确,以便中断能够及时响应。
    6. 主函数中的调用逻辑

      • 检查 OV7670_FIFOGetPicOV7670_SendPic 的调用时机是否合理,以及是否有可能存在竞态条件或死锁。
    7. 硬件连接和电源问题

      • 检查摄像头模块和 STM32 之间的硬件连接是否牢固,包括数据线和电源线。
      • 确认电源供应是否稳定,以及时钟配置是否正确。
    8. 其他潜在问题

      • 检查是否有其他外围设备或代码逻辑影响了数据的上传。

    如果以上检查都没有发现问题,您可能需要使用逻辑分析仪来监控 OV7670 的帧同步信号和串口通信,以确定数据是否真的没有被发送出去。

    另外,您提到的“用山外接收,一直没有图片”和“用SSCOM接收串口信息也接收不到”,这可能意味着数据根本就没有被发送,或者发送的数据格式不正确。确保您的上位机软件(如山外或SSCOM)配置正确,并且能够处理接收到的数据格式。

    由于我没有访问到您的具体硬件和软件环境,以上建议仅供参考。如果需要更详细的帮助,您可以提供更多的信息,例如 Serial_SendByte 函数的实现细节,以及任何错误信息或日志。

    希望这些建议能够帮助您解决问题!如果还有其他问题或需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月10日