问答

汇集网友智慧,解决技术难题

elephant00

TA的家园币:8738  

  • 使用 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

    DMA 读取SPI flash 异常 读取

    2024-11-07 15
  • 3.3V供电,能OC输出5V高电平吗?

    MCU3.3V供电,引脚上拉100K到5V控制PMOS管,实际输出高电平只有3.7V,PMOS管的GS电压有1.3V,无法关闭管子。只有通过分压尽可能减小GS的电压实现关断功能,单这样也会减小打开时的电压。OC输出高电平能到5V吗?

    MUC 5V 输出 供电 电平 电压

    2024-11-03 15
  • rtthread 驱动 hc32f4a0 开发板上tf卡的问题。。

    本帖最后由yqzq101于2024-10-1609:44编辑hello立创上请了一块谅山派的F4A0开发板。。发现rt-studio里面居然有这个开发板的支持试着创建了工程,闪了个灯一切OK想测试一下tf卡,按照网上搜的例子,打开了SDIOC1,加了fatfs,下载后,总提示如下:msh/>[E/drv.sdio]clockdivisionerror[E/drv.sdio]clockdivisionerror[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd0,arg:0x00000000[E/drv.sdio]clockdivisionerror[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd8,arg:0x000001AAclockdivisionerror[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd5,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd55,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd55,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd55,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd55,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd1,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd1,arg:0x00000000[E/drv.sdio][_sdio_wait_completedtimeout]sta=0x1FFE82A0,cmd1,arg:0x00000000请问这是为啥。。是我哪里没改好吗谢谢

    sdc HC32F4 开发板 rtthread TF IO

    2024-10-16 7
  • GD32f303rct6 RTC问题。

    我准备用兆易的GD32F103rct6,RTC时钟,它的时钟32.768晶振的选择是不是和STM32F103一样容易出现问题,不起振?在选择晶振时应注意什么?

  • 使用stm32mp157进行软件模式spi通讯,无法设置为四线模式

    本帖最后由七呀嘛七于2024-9-1810:10编辑目前使用stm32mp157芯片进行软件模式的spi通讯,设备树内对使用的gpio口定义如下:gpio_spi1:spi@1{compatible="spi-gpio";#address-cells=;#size-cells=;status="okay";sck-gpios=;mosi-gpios=;miso-gpios=;cs-gpios=,;//drv:i0dac:e6num-chipselects=;/*Clients*/spidev@0{reg=;compatible="linux,spidev";spi-max-frequency=;};spidev@1{reg=;compatible="linux,spidev";spi-max-frequency=;};};在使用read或ioctl函数,通过miso线进行读取时,发现读取到的都是mosi线的数据,也就是运行在三线模式。尝试使用ioctl(fd,SPI_IOC_WR_MODE,&mode)关闭三线模式,但没有产生效果。程序中spi读取的相关代码如下:intmyspi2_write_then_read(intfd,constuint8_t*tx_buf,size_tlen_tx,uint8_t*rx_buf,size_tlen_rx){structspi_ioc_transfertransfer[2];//两个传输结构,一个用于写入,一个用于读取memset(transfer,0,sizeof(transfer));//清空结构体//第一个传输,用于写入transfer[0].tx_buf=(unsignedlong)tx_buf;//发送缓冲区transfer[0].rx_buf=0;//不接收数据transfer[0].len=len_tx;//写入数据长度transfer[0].speed_hz=0;//使用当前SPI设备的默认速度transfer[0].cs_change=0;//在结束时不改变片选状态//第二个传输,用于读取transfer[1].tx_buf=0;//不发送数据transfer[1].rx_buf=(unsignedlong)rx_buf;//接收缓冲区transfer[1].len=len_rx;//读取数据长度transfer[1].speed_hz=0;//使用当前SPI设备的默认速度transfer[1].cs_change=0;//完成读写后释放片选//使用ioctl进行双向传输(写入+读取)intret=ioctl(fd,SPI_IOC_MESSAGE(2),transfer);printf("Wrote%zubytesandread%zubytesfromSPI\n",len_tx,len_rx);return0;}intspi_read(intfd,intread_length){uint8_tbuf[read_length];ssize_tret=read(fd,buf,sizeof(buf));printf("ReadfromSPI:");for(inti=0;i<ret;i++){printf(

  • GD32E230作为IIC从机时接收数据会卡顿是什么原因

    在配置完成IIC从机模式后,主机向从机发送9位数据,在从机收到数据后主函数的代码会跑不到,不知道在什么地方造成了阻塞,接收完毕会产生多次的STPDEF中断吗,但是IIC从机模式的故障应该也不会影响到主函数的运行才对,有没有懂的大佬帮忙分析一下谢谢,代码如下#include"gd32e230.h"#defineMSG_RECV_BYTE_SUM9#defineMSG_SEND_BYTE_SUM6#defineI2C0_OWN_ADDRESS70x44voidiic_msg_gpio_config_init(void){/*enableGPIOBclock*/rcu_periph_clock_enable(RCU_GPIOB);/*enableI2C0clock*/rcu_periph_clock_enable(RCU_I2C0);/*connectPB6toI2C0_SCL*/gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6);/*connectPB7toI2C0_SDA*/gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7);/*configureGPIOpinsofI2C0*/gpio_mode_set(GPIOB,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_6);gpio_output_options_set(GPIOB,GPIO_OTYPE_OD,GPIO_OSPEED_50MHZ,GPIO_PIN_6);gpio_mode_set(GPIOB,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_7);gpio_output_options_set(GPIOB,GPIO_OTYPE_OD,GPIO_OSPEED_50MHZ,GPIO_PIN_7);/*I2Cclockconfigure*/i2c_clock_config(I2C0,400000,I2C_DTCY_2);/*I2Caddressconfigure*/i2c_mode_addr_config(I2C0,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,I2C0_OWN_ADDRESS7);/*enableI2C0*/i2c_enable(I2C0);/*enableacknowledge*/i2c_ack_config(I2C0,I2C_ACK_ENABLE);nvic_irq_enable(I2C0_EV_IRQn,23);nvic_irq_enable(I2C0_ER_IRQn,32);/*enabletheI2C0interrupt*/i2c_interrupt_enable(I2C0,I2C_INT_ERR);i2c_interrupt_enable(I2C0,I2C_INT_EV);i2c_interrupt_enable(I2C0,I2C_INT_BUF);}voidi2c0_event_irq_handler(void){if(i2c_interrupt_flag_get(I2C0,I2C_INT_FLAG_ADDSEND)){//0:接收端//1:发送端tI2cSlave.uFlag.Bits.DirState=i2c_flag_get(I2C0,I2C_FLAG_TR);if(tI2cSlave.uFlag.Bits.DirState==RESET){msg_iic_recv

  • hc32f460 can导致单片机复位

    can使能后发送数据,如果can总线上没有其他节点接收数据,单片机直接重启。接上接收设备后,单片机正常工作。can配置代码如下//CANConfigstaticvoidApp_CANCfg(void){stc_can_init_tstcCanInit;/*************************ConfigureCAN1***************************/stc_can_filter_config_tastcFilter1[1U]={{0x1UL,0x0000UL,CAN_ID_STD},};/*InitializesCAN.*/(void)CAN_StructInit(&stcCanInit);stcCanInit.stcBitCfg.u32Prescaler=12U;stcCanInit.stcBitCfg.u32TimeSeg1=5U;stcCanInit.stcBitCfg.u32TimeSeg2=3;stcCanInit.stcBitCfg.u32SJW=3;stcCanInit.pstcFilter=astcFilter1;stcCanInit.u16FilterSelect=CAN_FILTER1;stcCanInit.u8WorkMode=CAN_WORK_MD_NORMAL;//CAN_WORK_MD_ELB;stcCanInit.u8PTBSingleShotTx=CAN_PTB_SINGLESHOT_TX_ENABLE;stcCanInit.u8STBSingleShotTx=CAN_STB_SINGLESHOT_TX_ENABLE;stcCanInit.u8STBPrioMode=CAN_STB_PRIO_MD_DISABLE;stcCanInit.u8RxWarnLimit=10U;stcCanInit.u8ErrorWarnLimit=15U;stcCanInit.u8RxAllFrame=CAN_RX_ALL_FRAME_DISABLE;stcCanInit.u8RxOvfMode=CAN_RX_OVF_DISCARD_NEW;stcCanInit.u8SelfAck=CAN_SELF_ACK_DISABLE;/*EnableperipheralclockofCAN.*/FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_CAN,ENABLE);(void)CAN_Init(CM_CAN,&stcCanInit);CAN_ExitLocalReset(CM_CAN);/*Enabletheinterrupts,thestatusflagscanberead.*/CAN_IntCmd(CM_CAN,CAN_INT_ALL,DISABLE);CAN_IntCmd(CM_CAN,CAN_INT_ERR_INT|CAN_INT_RX_BUF_WARN|CAN_INT_RX|CAN_INT_BUS_ERR,ENABLE);}

  • HC32L196KCTA

    HC32L196KCTA深度休眠模式,任意IO口都可以唤醒吗

    IO L19 HC 单片机

    2024-08-16 2
  • GD32H737 SPI datasize = 16 bit时无法收发

    这段代码执行的是SPI收发功能,使用仿真器debug时会停在spi_i2s_data_receive处(等待接收标志位),但是如果把datasize改成8bit就能正常收发数据,请问是什么原因呢?uint32_tSpi_Transfer16(SPI_BusDef*spi,uint16_t*TxBuf,uint16_t*RxBuf,uint16_tlen){uint32_tret=0;Spi_Nss(spi->Nss,0);spi_master_transfer_start(spi->Periph,SPI_TRANS_START);for(inti=0;iPeriph)&SPI_FLAG_TP));spi_i2s_data_transmit(spi->Periph,TxBuf);RxBuf=spi_i2s_data_receive(spi->Periph);}while(RESET==spi_i2s_flag_get(spi->Periph,SPI_FLAG_TC));Spi_Nss(spi->Nss,1);returnret;}

  • gd32f470怎么禁用串口0的调试功能

    再调试过程中发现再使用串口0收发数据时,如果调用复位函数NVIC_System_Reset()就会导致程序网络不通,而且也没有复位重启,串口0停止收发数据就不会出现这个问题,而且其他串口均不存在这个问题,怀疑是不是串口0有调试串口的功能,还是别的什么原因导致的。

  • MM32SPIN系统高级定时器输入捕获 没办法进入TIM_CC_IRQH中断

    MM32SPIN系统单片机高级定时器输入捕获没办法进入TIM_CC_IRQH中断voidRemote_1(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);//使能GPIOB时钟GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_7);//GPIOB4复用为TIM1//GPIOGPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}voidRemote_Init(uint16_tperiod,uint8_tprescaler){TIM_TimeBaseInitTypeDefTIM_StructInit;TIM_ICInitTypeDefTIM_ICInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);TIM_TimeBaseStructInit(&TIM_StructInit);TIM_StructInit.TIM_Period=period;TIM_StructInit.TIM_Prescaler=prescaler;TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1;TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up;TIM_StructInit.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM1,&TIM_StructInit);//TIM1输入捕获参数设置TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;//CC2S=01选择输入端IC2映射到TI1上TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上TIM_ICInitStructure.TIM_ICFilter=0x0;TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,不分频TIM_ICInit(TIM1,&TIM_ICInitStructure);TIM_ARRPreloadConfig(TIM1,ENABLE);TIM_ITConfig(TIM1,TIM_IT_CC2|TIM_IT_Update,ENABLE);TIM_CtrlPWMOutputs(TIM1,ENABLE);TIM_Cmd(TIM1,ENABLE);}voidRemote_2(void){NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM1_BRK_UP_TRG_COM_IRQn;//定时中断3NVIC_InitStructure.NVIC_IRQChannelPriority=1;//中断优

123下一页