I2S配置如下:
void Spi1Init(void){
uint32_t Temp;
SPI1->CR1=(uint32_t)
((0 << 15)| //-- 0=两线单向 1=单线双向
(0 << 14) | //-- 0=单线双向只接收 1=单线双向收发
(0 << 13) | //-- 0=CRC计算禁止 1=CRC计算使能
(0 << 12) | //-- 0=下一发送值来自发送寄存器 1=下一发送值来自CRC寄存器
(0 << 11) | //-- 0=8位CRC长度 1=16位CRC长度
(0 << 10) | //-- 0=两线单向全双工 1=两线单向只接收不发送
(1 << 9) | //--SSM 0=禁止NSS脚从设备管理 1=起用SSI软件从设备管理
(1 << 8) | //--SSI 当SSM位为1时,此位值觉得了NSS引脚电平
(0 << 7) | //-- 0=先发送MSB 1=先发送LSB
(0 << 6) | //-- 0=禁止SPI设备 1=开启SPI设备
(5 << 3) | //-- (0-7)波特率控制,为PCLK的分频倍数(2,4,8,16,32,64,128,256)
(1 << 2) | //-- 0=配置为从设备 1=主设备
(0 << 1) | //-- 时钟极性
(0 << 0)); //-- 时钟相位
SPI1->CR2=(uint32_t)
((0 << 14)| //-- 0=DMA最后发送总数为偶数 1=奇数
(0 << 13) | //-- 0=DMA最后接收总数为偶数 1=奇数
(0 << 12) | //-- 0=FIFO接收非空门限16位 1=8位
(15 << 8) | //-- (3-15)数据传输位宽,对应(4位-16位)
(0 << 7) | //-- 0=TXE中断屏蔽 1=TXE中断不屏蔽
(1 << 6) | //-- 0=RXNE中断屏蔽 1=RXNE中断不屏蔽
(0 << 5) | //-- 0=错误中断屏蔽 1=错误中断不屏蔽
(0 << 4) | //-- 0=SPI 摩托格式 1=SPI TI模式
(1 << 3) | //-- 0=没有NSS脉冲 1=有NSS脉冲
(0 << 2) | //-- 0=主模式下SS输出禁用 1=起用
(0 << 1) | //-- 0=TX的DMA缓冲禁止 1=启用
(0 << 0)); //-- 0=RX的DMA缓冲禁止 1=启用
//SPI1->SR;//----状态寄存器
//SPI1->DR;//----数据寄存器
//SPI1->CRCPR;//----CRC多项式
//SPI1->RXCRCR;//----接收CRC计算结果
//SPI1->TXCRCR;//----发射CRC计算结果
while((SPI1->SR & (3<<9 |1))!=0){Temp=SPI1->DR;}//----clear SPI FIFO
SPI1->I2SCFGR=(uint32_t)//----I2S配置
((1 << 11)| //-- 0=SPI 1=I2S
(0 << 10) | //-- 0=I2S OFF 1=I2S ON
(3 << 8) | //-- 0=从机发送 1=从机接收 2=主机发送 3=主机接收
(1 << 7) | //-- 0=短帧同步 1=长帧同步
(0 << 4) | //-- 0=I2S 1=左对齐 2=右对齐 3=PCM
(0 << 3) | //-- 0=时钟静态低电平 1=时钟静态高天平 时钟极性
(0 << 1) | //-- 0=16bit 1=24bit 2=32bit 3=禁止此值 待传输数据宽
(1 << 0)); //-- 0=0=16bit 1=32it 每个声道数据位数
SPI1->I2SPR=(uint32_t)//----I2S预分频器
((0 << 9)| //-- 0=主时钟输出禁止 1=主时钟输出使能
(0 << 8) | //-- 奇数分频
(16 << 0)); //-- 0-255 时钟分频
//SPI1->CR1 |=(uint32_t)(1 << 6);//----使能SPI
SPI1->I2SCFGR |=(uint32_t)(1<<10);//----使能I2S
while((SPI1->SR & (3<<9 |1))!=0){Temp=SPI1->DR;}//----clear SPI FIFO
NVIC_SetPriority(SPI1_IRQn,1);//----设置中断优先级为1级(0为最高级)
NVIC_EnableIRQ(SPI1_IRQn);//----使能SPI1_IRQn中断
}
|