OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5489|回复: 0

STM32H743,寄存器模式下,SPI只接收模式下cl时钟多出16位。

[复制链接]

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-8-24
在线时间
76 小时
发表于 2021-5-17 22:24:26 | 显示全部楼层 |阅读模式
SPI设置如下:
void SPI2_Init(void)
{         

        RCC->AHB4ENR|=1<<8;                        //使能PORTI时钟
        RCC->APB1LENR|=1<<14;                //SPI2时钟使能
        GPIO_Set(GPIOI,3<<1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_FAST,GPIO_PUPD_PU);        //PI1~2复用功能输出       
  GPIO_AF_Set(GPIOI,1,5);        //PI1,AF5
        GPIO_AF_Set(GPIOI,2,5);        //PI2,AF5
//         GPIO_AF_Set(GPIOB,15,5);        //PB15,AF5
        //配置SPI的时钟源
        RCC->D2CCIP1R&=~(7<<12);        //SPI123SEL[2:0]=0,清除原来的设置
        RCC->D2CCIP1R|=0<<12;                //SPI123SEL[2:0]=1,选择pll1_q_ck作为SPI1/2/3的时钟源,一般为200Mhz
                                                                //即:spi_ker_ck=200Mhz
        //这里只针对SPI口初始化
        RCC->APB1LRSTR|=1<<14;                //复位SPI2
        RCC->APB1LRSTR&=~(1<<14);        //停止复位SPI2
       
        SPI2->CR1|=1<<12;                        //SSI=1,设置内部SS信号为高电平       
        SPI2->CFG1=7<<28;                        //MBR[2:0]=7,设置spi_ker_ck为256分频.
        SPI2->CFG1|=7<<0;                        //DSIZE[4:0]=7,设置SPI帧格式为8位,即字节传输
        tempreg=(u32)1<<31;                        //AFCNTR=1,SPI保持对IO口的控制
        tempreg|=0<<29;                                //SSOE=0,禁止硬件NSS输出
        tempreg|=1<<26;                                //SSM=1,软件管理NSS脚
        tempreg|=1<<25;                                //CPOL=1,空闲状态下,SCK为高电平
        tempreg|=1<<24;                                //CPHA=1,数据采样从第2个时间边沿开始
        tempreg|=0<<23;                                //LSBFRST=0,MSB先传输
        tempreg|=1<<22;                                //MASTER=1,主机模式
        tempreg|=1<<19;                                //SP[2:0]=1,TI格式
        tempreg|=2<<17;                                //COMM[1:0]=01,直接收
        SPI2->CFG2=tempreg;                        //设置CFG2寄存器       
        SPI2->I2SCFGR&=~(1<<0);                //选择SPI模式
        SPI2->CR1|=1<<0;                        //SPE=1,使能SPI2
        SPI2_ReadByte();        //启动传输                          
}  


//SPI2 读写一个字节
//返回值:读取到的字节
u8 SPI2_ReadByte(void)
{                                   
        u8 RxData=0;       
        SPI2->CR1|=1<<0;                                //SPE=1,使能SPI2
        SPI2->CR1|=1<<9;                                  //CSTART=1,启动传输
       
//        while((SPI2->SR&1<<1)==0);                //等待发送区空
//        *(vu8 *)&SPI2->TXDR=TxData;                //发送一个byte,以传输长度访问TXDR寄存器   
        while((SPI2->SR&1<<0)==0);                //等待接收完一个byte  
        RxData=*(vu8 *)&SPI2->RXDR;                //接收一个byte,以传输长度访问RXDR寄存器       
       
        SPI2->IFCR|=3<<3;                                //EOTCTXTFC1,清除EOTTXTFC
        SPI2->CR1&=~(1<<0);                                //SPE=0,关闭SPI2,会执行状态机复位/FIFO重置等操作
        return RxData;                                        //返回收到的数据

QQ图片20210517221549.png
如图,始终多16个时钟。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表