[cpp]view plaincopy
- voidSPIx_Init(void)
- {
- RCC->APB2ENR|=1<<2;//PORTA时钟使能
- RCC->APB2ENR|=1<<12;//SPI1时钟使能
- //这儿只针对SPI口初始化
- GPIOA->CRL&=0X000FFFFF;
- GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
- GPIOA->ODR|=0X7<<5;//PA5.6.7上拉
- SPI1->CR1&=~(1<<10);//全双工形式
- SPI1->CR1|=1<<9;//软件nss办理
- SPI1->CR1|=1<<8;
- SPI1->CR1|=1<<2;//SPI主机
- SPI1->CR1|=0<<11;//8bit数据格式
- SPI1->CR1|=1<<1;//闲暇形式下SCK为1CPOL=1
- SPI1->CR1|=1<<0;//数据采样从第二个时刻边缘开端,CPHA=1
- SPI1->CR1|=7<<3;//Fsck=Fcpu/256
- SPI1->CR1|=0<<7;//MSBfirst
- SPI1->CR1|=1<<6;//SPI设备使能
- SPIx_ReadWriteByte(0xff);//发动传输
- }
关于这个函数,有几个问题:
GPIOA->CRL&=0X000FFFFF; //先将Pin5 6 7 对应的装备为清零,其他位不变
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用推挽输出(50MHz)
GPIOA->ODR|=0X7<<5; //PA5.6.7上拉
PA5-SCLK;PA6-MISO;PA7-MOSI;
第二行中,为什么PA6 也装备为推挽输出呢?PA6 不是应该装备为输入吗?
为什么最终还有用GPIOA->ODR|=0X7<<5 装备为上拉呢?ODR寄存器不是只要在输入形式设置上拉或许下拉时才用吗 ?
还有便是:初始化结尾处
SPIx_ReadWriteByte(0xff);//发动传输 这句怎样了解? 为什么要用0xff?
关于这个问题,正点原子的答复是这样:
1,请注意,这儿是复用输出.在复用功用下面,输入输出的方向,完全由内部操控.不需要你的程序处理. (这个意思是说,复用形式下输入形式仍是输出形式由内部决议?)
2,装备为上拉,是常用的设置,这样设置的优点,便是能够让你的IO处于一个电平,而许多时分,外设默许的电平便是高电平的.所以设置为高,是有道理的.
3,发送0XFF发动传输,这句你能够试试去掉.为什么用0XFF,也没有硬性规定,你能够试试0X00.不过最好别用其他的,假如你用其他的,说不定便是外设的某个指令了.
经过此次试验再次学习了端口复用的办法:
1.使能GPIO口时钟
2.使能外设时钟
3.装备复用功用输出
4.初始化GPIO