OpenEdv-开源电子网

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

stm32h743 SPI4 数据发送问题

[复制链接]

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
480
金钱
480
注册时间
2014-2-24
在线时间
123 小时
发表于 2023-2-14 16:52:38 | 显示全部楼层 |阅读模式
50金钱
STM32H743 SPI4寄存器配置如下,现在的问题是只要一读写数据就会卡死在         while((SPI4->SR&1<<0)==0);                //等待接收完一个byte    这里

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

//以下是SPI模块的初始化代码,配置成主机模式                                                   
//SPI口初始化
//这里针是对SPI4的初始化
void SPI4_Init(void)
{         
        u32 tempreg=0;
        RCC->AHB4ENR|=1<<4;                        //使能PORTE时钟
        RCC->APB2ENR|=1<<13;                //SPI4时钟使能
        RCC->APB2LPENR|=1<<13;                //SPI4时钟使能
        GPIO_Set(GPIOE,0x64<<1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_FAST,GPIO_PUPD_PU);        //PE2,PE5,PE6复用功能输出       
          GPIO_AF_Set(GPIOE,2,5);                //PE2,AF5
        GPIO_AF_Set(GPIOE,5,5);                //PE5,AF5
        GPIO_AF_Set(GPIOE,6,5);                //PE6,AF5
        //配置SPI的时钟源
        RCC->D2CCIP1R&=~(7<<16);        //SPI45SEL[2:0]=0,清除原来的设置
        RCC->D2CCIP1R|=0<<16;                //SPI45SEL[2:0]=1,选择pll1_q_ck作为SPI1/2/3的时钟源,一般为200Mhz
                                                                //即:spi_ker_ck=200Mhz
        //这里只针对SPI口初始化
        RCC->APB2RSTR|=1<<13;                //复位SPI4
        RCC->APB2RSTR&=~(1<<13);        //停止复位SPI4
//       
//        SPI4->CFG1=0x70007;
//        SPI4->SR=0x1002;
//        SPI4->CRCPOLY=0x107;
//        SPI4->CFG1=0x70000007;
//        SPI4->CFG2=0x07400000;
//        SPI4->CFG2=0x87400000;
       
        SPI4->CR1|=1<<12;                        //SSI=1,设置内部SS信号为高电平       
        SPI4->CFG1=7<<28;                        //MBR[2:0]=2,设置spi_ker_ck为32分频.3.125MHZ   4<<28
        SPI4->CFG1|=7<<0;                        //DSIZE[4:0]=7,设置SPI帧格式为8位,即字节传输
//        SPI4->CFG1|=3<<14;                        //使能RX/TXDMA
        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|=0<<19;                                //SP[2:0]=0,摩托罗拉格式
        tempreg|=0<<17;                                //COMM[1:0]=0,全双工通信
        SPI4->CFG2=tempreg;                        //设置CFG2寄存器       
        SPI4->I2SCFGR&=~(1<<0);                //选择SPI模式
        SPI4->CR1|=1<<0;                        //SPE=1,使能SPI4

        SPI4_ReadWriteByte(0xff);        //启动传输                 
}

最佳答案

查看完整内容[请看2#楼]

解决了问题是这0x64
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
480
金钱
480
注册时间
2014-2-24
在线时间
123 小时
 楼主| 发表于 2023-2-14 16:52:39 | 显示全部楼层
解决了问题是这0x64<<1改为0x64<<0
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2023-2-14 23:51:17 | 显示全部楼层
参考下我们的H743例程仔细对比下看看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
480
金钱
480
注册时间
2014-2-24
在线时间
123 小时
 楼主| 发表于 2023-2-15 07:51:51 | 显示全部楼层
就是参考了743的例程中写的,SPI1\2多没问题4就老是卡死,今天在查查
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2023-2-16 00:52:05 | 显示全部楼层
xad74 发表于 2023-2-15 07:51
就是参考了743的例程中写的,SPI1\2多没问题4就老是卡死,今天在查查

解决了么?对比看看寄存器状态, 另外看看SCK, MOSI, MISO的波形
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-9 06:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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