您的位置 首页 资料

STM32-SPI试验学习笔记

[cpp]viewplaincopyvoidSPIx_Init(void){RCC->APB2ENR

[cpp]view plaincopy

  1. voidSPIx_Init(void)
  2. {
  3. RCC->APB2ENR|=1<<2;//PORTA时钟使能
  4. RCC->APB2ENR|=1<<12;//SPI1时钟使能
  5. //这儿只针对SPI口初始化
  6. GPIOA->CRL&=0X000FFFFF;
  7. GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
  8. GPIOA->ODR|=0X7<<5;//PA5.6.7上拉
  9. SPI1->CR1&=~(1<<10);//全双工形式
  10. SPI1->CR1|=1<<9;//软件nss办理
  11. SPI1->CR1|=1<<8;
  12. SPI1->CR1|=1<<2;//SPI主机
  13. SPI1->CR1|=0<<11;//8bit数据格式
  14. SPI1->CR1|=1<<1;//闲暇形式下SCK为1CPOL=1
  15. SPI1->CR1|=1<<0;//数据采样从第二个时刻边缘开端,CPHA=1
  16. SPI1->CR1|=7<<3;//Fsck=Fcpu/256
  17. SPI1->CR1|=0<<7;//MSBfirst
  18. SPI1->CR1|=1<<6;//SPI设备使能
  19. SPIx_ReadWriteByte(0xff);//发动传输
  20. }

关于这个函数,有几个问题:

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/261459.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部