什么也不说:
FYI:
//STM32F051的一个函数
void SPI_F051_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; //SPI2 CLK
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //SPI1 CLK
RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
RCC->APB2RSTR |= RCC_APB2RSTR_SPI1RST;
RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST);
RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST);
//SPI2_RX
Talk_Status.Bit.SPI_TX_Ongoing = 1;
// SPI2->CR1 = //SPI_CR1_BIDIMODE //2线单向模式 1:间线双向模式
//| SPI_CR1_BIDIOE //1:输出使能 0:输出禁止,只收 与15Bit 组合使用
//| SPI_CR1_CRCEN //CRC_EN
//| SPI_CR1_CRCNEXT //0 CRC紧接缓冲区 1:CRC来自寄存器
//| SPI_CR1_CRCL // 8位或16位CRC
//| SPI_CR1_RXONLY //全双工, 多从机时,从机置此位,防多从机同时发送
// SPI_CR1_SSM //禁软件从设备NSS 管理 如置此位,NSS由SPI_CR1_SSI决定
//| SPI_CR1_SSI //内部从设备选择
//| SPI_CR1_LSBFIRST //MSB先发, 如置1 LSB先发
//| SPI_CR1_SPE //SPI EN
// | ((uint16_t)(0x0004) << 3) //6M//Speed : (PCLK / N) 0,2 1,4.......7,256
//| SPI_CR1_MSTR //主机
//| SPI_CR1_CPOL //时钟空闲时极性, 0低 1高
//| SPI_CR1_CPHA //时钟相位 0第一个时钟对齐第一位数据 1,第二个时钟对齐第一个数据
;
SPI2->CR2 = //SPI_CR2_LDMATX //TX传输数为偶数, 1为奇数 传输小于或等于8时有意义
//| SPI_CR2_LDMARX //RX..........
//SPI_CR2_FRXTH //RX FIFO触发RXNE阀值, 0 1/2(16Bit) 1 1/4(8Bit)
((uint16_t)(0x000F) << 8) //数据位宽 值+1
//| SPI_CR2_TXEIE //TX缓冲空中断 1使能
| SPI_CR2_RXNEIE //RX缓冲非空中断 TXE标志置1时,产生中断
//| SPI_CR2_ERRIE //错误事件时产生中断 1使能
| SPI_CR2_FRF //0 Motorola模式 1 TI模式
//| SPI_CR2_NSSP //0 没NSS脉冲 1产生NSS脉冲 ---连续传输时
//| SPI_CR2_SSOE //0 SS禁用 1产生SS
//| SPI_CR2_TXDMAEN //TX缓冲DMA使能
| SPI_CR2_RXDMAEN //RX.......
;
SPI2->CR1 |= SPI_CR1_SPE;
// SPI2->SR &= (uint16_t)0xFFFE;
//SPI1_TX
SPI1->CR1 = //SPI_CR1_BIDIMODE //2线单向模式 1:间线双向模式
//| SPI_CR1_BIDIOE //1:输出使能 0:输出禁止,只收 与15Bit 组合使用
//| SPI_CR1_CRCEN //CRC_EN
//| SPI_CR1_CRCNEXT //0 CRC紧接缓冲区 1:CRC来自寄存器
//| SPI_CR1_CRCL // 8位或16位CRC
//| SPI_CR1_RXONLY //全双工, 多从机时,从机置此位,防多从机同时发送
// SPI_CR1_SSM //禁软件从设备NSS 管理 如置此位,NSS由SPI_CR1_SSI决定
// | SPI_CR1_SSI //内部从设备选择
//| SPI_CR1_LSBFIRST //MSB先发, 如置1 LSB先发
//| SPI_CR1_SPE //SPI EN
((uint16_t)(0x0001 << 3)) //2:6M//Speed : (PCLK / N) 0,2 1,4.......7,256
| SPI_CR1_MSTR //主机
//| SPI_CR1_CPOL //时钟空闲时极性, 0低 1高
//| SPI_CR1_CPHA //时钟相位 0第一个时钟对齐第一位数据 1,第二个时钟对齐第一个数据
;
SPI1->CR2 = //SPI_CR2_LDMATX //TX传输数为偶数, 1为奇数 传输小于或等于8时有意义
//| SPI_CR2_LDMARX //RX..........
//| SPI_CR2_FRXTH //RX FIFO触发RXNE阀值, 0 1/2(16Bit) 1 1/4(8Bit)
((uint16_t)(0x000F) << 8) //数据位宽 值+1 //F
//| SPI_CR2_TXEIE //TX缓冲空中断 1使能
//| SPI_CR2_RXNEIE //RX缓冲非空中断 TXE标志置1时,产生中断
//| SPI_CR2_ERRIE //错误事件时产生中断 1使能
| SPI_CR2_FRF //0 Motorola模式 1 TI模式
//| SPI_CR2_NSSP //0 没NSS脉冲 1产生NSS脉冲 ---连续传输时
//| SPI_CR2_SSOE //0 SS禁用 1产生SS
| SPI_CR2_TXDMAEN //TX缓冲DMA使能
//| SPI_CR2_RXDMAEN //RX.......
;
SPI1->CR1 |= SPI_CR1_SPE; //SPI EN
DMA_SPI_Init();
DMA_SPI_Enable();
Talk_Status.Bit.SPI_RX_Disable = 0;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
} |