OpenEdv-开源电子网

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

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

[复制链接]

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-8-24
在线时间
76 小时
发表于 2021-5-17 22:34:19 | 显示全部楼层 |阅读模式
90金钱
本帖最后由 匆匆过客01 于 2021-5-18 18:59 编辑

用stm32H743读ads1675数据,数据是24位的,但是sclk时钟始终多出16bit,以读一个字节8bit为例,时钟输出24个时钟。
代码如下:
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
        //配置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]=0,摩托罗拉格式
        tempreg|=2<<17;                                //COMM[1:0]=0,全双工通信
        SPI2->CFG2=tempreg;                        //设置CFG2寄存器        
        SPI2->I2SCFGR&=~(1<<0);                //选择SPI模式
        SPI2->CR1|=1<<0;                        //SPE=1,使能SPI2
        SPI2_ReadByte();        //启动传输                          
}

//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
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;                                //EOTC和TXTFC置1,清除EOT和TXTFC位
        SPI2->CR1&=~(1<<0);                                //SPE=0,关闭SPI2,会执行状态机复位/FIFO重置等操作
        return RxData;                                        //返回收到的数据
}

时序图:
QQ图片20210517221549.png
void EXTI0_IRQHandler(void)
{
        static u8 led0sta=1;
        EXTI_D1->PR1=1<<0;  //清除LINE0上的中断标志位  
        ADS1675_CS(0);
       ads1675_data=SPI2_ReadByte();         
        ADS1675_CS(1);
}        


SPI2_CFG1.png SPI2_CFG2.png 在主程序中实时查看SPI2->CFG1,SPI2->CFG2。设置也没问题。


QQ图片20210517221549.png
QQ图片20210517221549.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-5-18 16:02:03 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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