初级会员

- 积分
- 83
- 金钱
- 83
- 注册时间
- 2021-3-30
- 在线时间
- 26 小时
|
1金钱
翻了很久的参考手册,还是没能找到问题在哪,因此请教下大家有没有遇到同样问题或者是对H7比较了解的,麻烦指点一下,非常感谢,初始化代码如下:/*******************************************************************
* PD7-----------------------------------------------------SPI1_MOSI
* PG9-----------------------------------------------------SPI1_MISO
* PG10----------------------------------------------------SPI1_NSS
* PG11----------------------------------------------------SPI1_SCK
* ****************************************************************/
void SPI_And_DMA_Driver_Init_For_NETX90(uint8_t * t_u8pReceiveBuffer,uint8_t * t_u8pTransmitBuffer)
{
RCC->AHB4ENR |= 1 << 3; //使能GPIOD时钟
RCC->AHB4ENR |= 1 << 6; //使能GPIOG时钟
RCC->APB2ENR |= 1 << 12; //使能SPI时钟
GPIO_Set(GPIOD,1 << 7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU); //PD7
GPIO_Set(GPIOG,1 << 9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU); //PG9
GPIO_Set(GPIOG,1 << 10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);//PG10
// GPIO_Set(GPIOG,1 << 10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);//PG10
GPIO_Set(GPIOG,1 << 11,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);//PG11
GPIO_AF_Set(GPIOD,7,5); //PD7,AF5
GPIO_AF_Set(GPIOG,9,5); //PG9,AF5
GPIO_AF_Set(GPIOG,11,5); //PG11,AF5
// GPIO_AF_Set(GPIOG,10,5); //PG10,AF5
GPIO_Pin_Set(GPIOG,PIN10,1);
RCC->APB2RSTR |= 1 << 12;
RCC->APB2RSTR &= ~(1 << 12);
SPI1->CFG1 |= 3 << 28;//SPI波特率使用APB2时钟频率(200M)的16分频
SPI1->CFG2 |= 0 << 17;//全双工模式
SPI1->CFG2 |= 1 << 25;//时钟信号空闲时为高电平
SPI1->CFG2 |= 1 << 24;//从第二个时钟边沿开始采样数据
SPI1->CFG1 |= 7 << 0;//8位数据格式
SPI1->CFG2 |= 0 << 23;//从高位先开始发送
SPI1->CFG2 |= 0 << 19;//摩托罗拉协议
SPI1->CFG1 |= 0 << 22;//失能CRC功能
SPI1->CR1 |= 0 << 13;//不使用全尺寸CRC多项式
SPI1->CFG2 |= 1 << 26;//软件控制NSS脚
SPI1->CR1 |= 1 << 12;//set SSI bit
SPI1->CFG1 |= 0 << 5;//FIFO阈值为1个DATA
SPI1->CFG2 |= 1 << 30;//DISABLE PLUSE OUTPUT
SPI1->CFG2 |= 0 << 31;//外设时钟控制所有相关GPIO
SPI1->CFG2 |= 1 << 22;//作为主模式
//SPI1_RX_DMA
RCC->AHB1ENR |= 1 << 0; //使能DMA1时钟
while(DMA1_Stream0->CR&0X01); //当该位为0时才可以写入
DMA1->LIFCR |= 0x3D << (6 * 0); //清空之前该stream上的所有中断标志
DMAMUX1->CCR = 37; //DMA请求源配置为SPI1_RX
DMA1_Stream0->PAR = (uint32_t)&SPI1->RXDR; //外设地址
DMA1_Stream0->M0AR = (uint32_t)t_u8pReceiveBuffer; //DMA存储器地址
DMA1_Stream0->NDTR = 0; //数量
DMA1_Stream0->CR = 0; //先复位全部CR寄存器
DMA1_Stream0->CR|=0<<6; //
DMA1_Stream0->CR|=0<<8; //非循环模式
DMA1_Stream0->CR|=0<<9; //外设非增量模式
DMA1_Stream0->CR|=1<<10; //存储器增量模式
DMA1_Stream0->CR|=0<<11; //外设数据长度:8位
DMA1_Stream0->CR|=0<<13; //存储器数据长度:8位
DMA1_Stream0->CR|=1<<16; //中等优先级
DMA1_Stream0->CR|=0<<21; //外设突发单次传输
DMA1_Stream0->CR|=0<<23; //存储器突发单次传输
//SPI1_TX_DMA
while(DMA1_Stream1->CR&0X01); //该位为0时才可以进行相关配置
DMA1->LIFCR |= 0x3D << (6 * 1); //清空之前该strem上的所有中断标志
DMAMUX1->CCR = 38; //DMA请求源配置为SPI1_TX
DMA1_Stream1->PAR = (uint32_t)&SPI1->TXDR; //外设地址
DMA1_Stream1->M0AR = (uint32_t)t_u8pTransmitBuffer; //DMA存储器地址
DMA1_Stream1->NDTR = 0; //数量
DMA1_Stream1->CR = 0; //先复位全部CR寄存器
DMA1_Stream1->CR|=1<<6; //存储器到外设模式
DMA1_Stream1->CR|=0<<8; //非循环模式
DMA1_Stream1->CR|=0<<9; //外设非增量模式
DMA1_Stream1->CR|=1<<10; //存储器增量模式
DMA1_Stream1->CR|=0<<11; //外设数据长度:8位
DMA1_Stream1->CR|=0<<13; //存储器数据长度:8位
DMA1_Stream1->CR|=1<<16; //中等优先级
DMA1_Stream1->CR|=0<<21; //外设突发单次传输
DMA1_Stream1->CR|=0<<23; //存储器突发单次传输
SPI1->CR1 |= 1 << 0;
}
|
|