你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F3 SPI问题

[复制链接]
mcuyangyifan 提问时间:2015-10-11 22:58 /
SPI配置如下:
        GPIO_InitTypeDef                 GPIO_InitStructure;
        SPI_InitTypeDef                SPI_InitStructure;
        
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_5);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_5);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_5);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_5);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15 | GPIO_Pin_14;        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        SPI_I2S_DeInit(SPI2);
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI2,&SPI_InitStructure);
        SPI_RxFIFOThresholdConfig(SPI2,SPI_RxFIFOThreshold_QF);
        SPI_Cmd(SPI2,ENABLE);                //Enable SPI2


收发数据如下:
uint8_t SPI2ExchangeData(uint8_t data)
{
        while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
        SPI2->DR = data;                //此处测量SCK,发现有16个时钟
//        SPI_SendData8(SPI2,data);
        while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
        return (SPI2->DR);
//        return SPI_ReceiveData8(SPI2);
}


       SPI读取字代码:
uint16_t SPIReadWord(uint16_t *Ressult)
{
        char dataRx1,dataRx2;
        dataRx1 = SPI2ExchangeData(0xFF);
        dataRx2 = SPI2ExchangeData(0xFF);
        *Ressult = (uint16_t) (dataRx2 + (dataRx1 << 8));
        return *Ressult;
}

求大神指点,上面的代码是否有问题?
收藏 1 评论6 发布时间:2015-10-11 22:58

举报

6个回答
mark0668 回答时间:2015-10-11 23:02:13
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{                                          
        u8 retry=0;
        uint32_t spixbase = 0x00;
        SPI_TypeDef* SPIx;
        SPIx=SPI1;       
  spixbase = (uint32_t)SPIx;
  spixbase += 0x0C;
        while((SPI1->SR&1<<1)==0)//等待发送区空       
        {
                retry++;
                if(retry>200)return 0;
        }                          
        *(__IO uint8_t *) spixbase = TxData;
        while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
        {
                retry++;
                if(retry>200)return 0;
        }         
        return *(__IO uint8_t *) spixbase;
                    
}


F3 需要这样写。强制转为8位,不然就是16位发送
alisa123 回答时间:2015-10-12 10:30:28
正在学习这块,帮顶!
mcuyangyifan 回答时间:2015-10-12 15:45:12
mark0668 发表于 2015-10-11 23:02
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节

8位数据收发,上面的SPI配置有问题吗?特别是
SPI_RxFIFOThresholdConfig(SPI2,SPI_RxFIFOThreshold_QF);
废鱼 回答时间:2015-10-12 16:29:49
楼主可以先测试一下代码,在测试过程中遇到问题,比如SPI不发送数据等等原因,具体说明。大家一块看,光看配置也看不出来。
mcuyangyifan 回答时间:2015-10-12 17:54:32
mcuyangyifan 发表于 2015-10-12 15:45
8位数据收发,上面的SPI配置有问题吗?特别是
SPI_RxFIFOThresholdConfig(SPI2,SPI_RxFIFOThreshold_QF); ...

谢谢!问题解决了!配置没有问题!4楼给的8位收发函数解决问题了,开始一直按照F1系列的收发函数除了状况!感谢各位!
#define 回答时间:2015-10-12 18:38:33
我也在看这个    二楼大神      

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版