-
使用 DMA写flash后,读取数据出现错位现象
使用DMA写flash后,读取数据出现错位现象,读到的buffer的第一节总为0,从第二字节开始才是正常数据。只能在24bit地址发送完后,再发一个DUMMY_BYTE(无效字节),才能bufferr接收数据。一但调“dma_channel_enable(DMA1,DMA_CH3)这个使能”后就出现上述现象。每次读取数据时都要先发一个DUMMY_BYTE才能正确接收。若上电不调“dma_channel_enable(DMA1,DMA_CH3)“接收都是正常的。使用的MCU是GD32F470VIT6,SPIFLAH是GD25Q40C.请各位大佬帮忙分析下。以下为SPI代码DMA配置voiddma_init(uint8_t*data_buffer,uint32_tdata_length){dma_single_data_parameter_structdma_init_struct;rcu_periph_clock_enable(RCU_DMA1);//DMA发送dma_deinit(DMA1,DMA_CH3);//DMA初始化参数设置dma_init_struct.direction=DMA_MEMORY_TO_PERIPH;dma_init_struct.memory0_addr=(uint32_t)data_buffer;dma_init_struct.memory_inc=DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.periph_addr=(uint32_t)&SPI_DATA(SPI0);dma_init_struct.periph_inc=DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.periph_memory_width=DMA_MEMORY_WIDTH_8BIT;dma_init_struct.number=data_length;dma_init_struct.circular_mode=DMA_CIRCULAR_MODE_DISABLE;dma_init_struct.priority=DMA_PRIORITY_MEDIUM;dma_single_data_mode_init(DMA1,DMA_CH3,&dma_init_struct);dma_channel_subperipheral_select(DMA1,DMA_CH3,DMA_SUBPERI3);//使能DMA中断通道nvic_irq_enable(DMA1_Channel3_IRQn,0,0);//配置DMA中断使能位//dma_circulation_disable(DMA1,DMA_CH3);dma_interrupt_enable(DMA1,DMA_CH3,DMA_CHXCTL_FTFIE);}DMA发送int8_tspi_dma_data_send(uint8_t*pbuffer,uint32_twrite_addr,uint16_tnum_byte_to_write){/*enablethewriteaccesstotheflash*/spi_flash_write_enable();/*selecttheflash:chipselectlow*/SPI_FLASH_CS_LOW();/*send"writetomemory"instructi
2024-11-07 16 -
PSOC4的EZI2C深度睡眠唤醒问题
你好,使能EZI2C的EnableWakeupfromDeepSleepMode功能,在系统进入深度睡眠,通过此功能唤醒芯片,是否一定会导致主机获取第一帧数据失败,谢谢。
2024-01-31 19 -
HC32L110 采集ADC有可能一直没有值吗
先说现象:1.试产了1000个大约有20个,ADC采样一直通不过。复位以后程序又正常工作,采样正常。2.对不能正常工作的产品测量对应引脚:(1)引脚上模拟信号量在变化,0~3V。(2)ADC连续转换中断有产生,因为我的程序在转换完成中断会关闭ADC使能,把检测口关闭。还把光敏电阻的电源关闭。通过测量光敏电阻电源,和引脚上的变化。确定ADC程序在运行,正常结束。程序结构:1.上电后初始化ADC功能。关闭ADC。因为是低功耗项目,所以不用的时候都关闭了外设。2.在需要的时候,开启转换。转换完成中断后,把ADC值保存在数组中,关闭ADC。3.程序任务判断ADC的值,做出对应动作。出错在这里,外部模拟量变化,这里没有反应。我怀疑是我的ADC设置不对,但是又没有找到哪不对。其中,我实际使用中因为不停的开关BGR,发现BGR的使能时间对结果影响非常大。我实际测试当BGR使能时间大于1ms,结果比较稳定。我程序中是使能了1.5ms才开启的转换。实际电路中因为输入阻抗大,所以程序开启了电压跟随器功能。看具体的操作:需要转换时:开启光敏电源使能对应扫描通道使能ADC时钟使能ADC使能BGR延时1.5ms清除ADC连续转换完成中断标志中断使能复位ADC连续转换状态启动ADC转换ADC中断程序:清除连续转换完成中断获取对应通道ADC值保存在数组中。禁止BGR禁止ADC禁止ADC时钟禁止ADC中断关闭光敏电源使用时:取ADC数据赋给局部变量局部变量参与运算,判断数据在哪个区间段根据区间段做出对应动作。最后,希望有大佬能提供思路。我在考虑是不是要周期性重新初始化ADC,但是这个是治标不治本的办法,我没有找到为什么会出现这个。
2023-12-20 13 -
GD32F105RB 使用官方USB例程,运行至枚举状态机时进入死循环
将外部晶振修改为8M之后,打印主频96M,一切正常,但是USB的时钟源是未进行修改,应为我主频没变,时钟配置如下voidusb_rcu_config(void){uint32_tsystem_clock=rcu_clock_freq_get(CK_SYS);printf("系统时钟为:%d\n",system_clock);if(48000000U==system_clock){usbfs_prescaler=RCU_CKUSB_CKPLL_DIV1;timer_prescaler=3U;}elseif(72000000U==system_clock){usbfs_prescaler=RCU_CKUSB_CKPLL_DIV1_5;timer_prescaler=5U;printf("系统时钟为:%d\n",system_clock);}elseif(96000000U==system_clock){usbfs_prescaler=RCU_CKUSB_CKPLL_DIV2;timer_prescaler=7U;}else{/*reserved*/}rcu_usb_clock_config(usbfs_prescaler);rcu_periph_clock_enable(RCU_USBFS);}但是运行至枚举状态机时就卡死在死循环不出来,这是为什么呢进入caseHOST_DEV_ENUM:之后:调用usbh_devdesc_get(uhost,8U))-----》》》usbh_ctl_handler(uhost);------》》》if(URB_DONE==usbh_urb_wait(uhost,uhost->control.pipe_in_num,DATA_STAGE_TIMEOUT)){uhost->control.ctl_state=CTL_STATUS_OUT;}就卡死在这个等待
2022-10-09 5