在CW32F030芯片上使用SPI DMA的BULK模式传输失败,可能由以下原因导致:
SPI_BulkModeCmd(SPI, ENABLE); // 启用BULK连续传输模式DR) 与内存的数据宽度一致(通常为8位)。 DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI->DR); // 目标地址 = SPI数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)txBuffer; // 源地址 = 内存数据数组
DMA_InitStructure.DMA_BufferSize = dataSize; // 传输长度 = 数据字节数
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 8位宽度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 8位宽度
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 非循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA_CHx, &DMA_InitStructure); // 初始化DMA通道(CHx需匹配SPI映射)
SPI_DMACmd(SPI, SPI_DMAReq_Tx, ENABLE); // 使能SPI的DMA发送请求SPI_NSS_Soft) 且使能了硬件SSN控制 (SPI_SSNCmd),可能导致冲突。SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; // 使用硬件NSS控制
SPI_Init(SPI, &SPI_InitStructure);
SPI_SSNCmd(SPI, ENABLE); // 确保硬件SSN使能(BULK模式必须)SPI_BaudRatePrescaler_2 时)。SPI_BaudRatePrescaler_8)。 DMA_Cmd(DMA_CHx, ENABLE); // 先使能DMA
SPI->DR = 0x00; // 写入DR寄存器,启动BULK传输(值不影响)DMA_ITConfig(DMA_CHx, DMA_IT_TC, DISABLE); // 禁用DMA传输完成中断SPI配置修正:
void SPI_Configuration(void) {
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_TxOnly;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; // 硬件NSS控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 降低时钟测试
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI, &SPI_InitStructure);
SPI_SSNCmd(SPI, ENABLE); // 硬件SSN使能
SPI_BulkModeCmd(SPI, ENABLE); // 关键!启用BULK模式
SPI_Cmd(SPI, ENABLE); // 最后使能SPI
}DMA_Cmd(DMA_CHx, ENABLE); // 使能DMA
SPI->DR = 0x00; // 触发BULK传输DMA_FLAG_TCx) 是否置位,确认传输是否被完整执行。通过以上调整,BULK模式应能消除字节间的60ns间隙,实现连续稳定传输。如果问题仍存在,建议检查芯片勘误手册(Errata)中SPI-DMA相关的已知问题。
举报
更多回帖