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

072RB-Nucleo上手之SPI

[复制链接]
woshilee 发布时间:2014-12-16 19:36
本帖最后由 woshilee 于 2014-12-16 19:55 编辑

M0的SPI终于调通了,玩儿M3,M4多了现在玩M0就有了固定的思维模式,老路走不通的话就要找它们之间的不同之处了贴上程序吧
#include "stm32f0xx.h"
#include "stdio.h"
uint8_t         getbyte=0;
/**
  * @brief  Delay
  * @param  None
  * @retval None
  */
void delay1ms(unsigned int ms)
{
    unsigned int i,j;
    for(i=0; i<ms; i++)
        for(j=0; j<100; j++);
}

/**
  * @brief  GPIO Config
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef        GPIO_InitStructure;

    /* Configure  PA5£¬PA7 in output nopull mode */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

           
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//Ðü¿Õ»òÉÏÀ­ÊäÈë
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_PinAFConfig(GPIOA,GPIO_PinSource4, GPIO_AF_0);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_0);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6, GPIO_AF_0);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7, GPIO_AF_0);
}
void RCC_Configuration(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
}
void SPI_Configuration(void)
{
    SPI_InitTypeDef SPI_InitStructure;
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;         
                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
                SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
                SPI_InitStructure.SPI_CRCPolynomial = 7;                                 
                SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
                SPI_Init(SPI1, &SPI_InitStructure);                                          
                SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
        
                SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
        
                SPI_Cmd(SPI1, ENABLE); /* SPI enable */
        
}


uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{               
        uint8_t RxData = 0;
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);         //µÈ´ý·¢ËÍ»º³åÇø¿Õ
        SPI_SendData8(SPI1, TxData);                                         //·¢Ò»¸ö×Ö½Ú
        
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
        RxData = SPI_ReceiveData8(SPI1);//SPI2                                     //·µ»Ø½ÓÊÕµ½µÄÊý¾Ý*/
        return (uint8_t)RxData;                                    
}




int main(void)
{

        RCC_Configuration();
        GPIO_Configuration();
        SPI_Configuration();
        
//    NVIC_Configuration();
        

        while (1)
        {

          getbyte=SPI1_ReadWriteByte(0x55);
                delay1ms(100);
    }
}
红色的语句在M3中是没有的,在M0中这个函数的定义如下:

/**
  * @brief  Configures the FIFO reception threshold for the selected SPI.
  * @param  SPIx: where x can be 1 or 2 to select the SPI peripheral.
  * @param  SPI_RxFIFOThreshold: specifies the FIFO reception threshold.
  *   This parameter can be one of the following values:
  *     @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO
  *          level is greater or equal to 1/2.
  *     @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO
  *          level is greater or equal to 1/4.
  * @retval None
  */
void SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold)
{
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));
  assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));

  /* Clear FRXTH bit */
  SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH);

  /* Set new FRXTH bit value */
  SPIx->CR2 |= SPI_RxFIFOThreshold;
}

如果不加这句话的话,肯定会卡在判断RXNE位的地方,因为没有产生这个标志,如果用延时的代替的话是可以发送出去的,但是时序就会有问题,因为发送语句执行后不是立即就完成的。希望大家注意到这一点

所有SPI 数据换都通过32 位的嵌入式FIFO,设置FRXTH 位。 RXFIFO 的阈值必须和对SPIx_DR 寄存器的读访问的字长对齐比如发送的是8位的数据,就要设置SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO   *level is greater or equal to 1/4. 就是32/4=8--》1个字节
如果发送的是16位数据就要设置SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO   *level is greater or equal to 1/2.就是 32/2=16--》2个字节
M0-SPI框图.jpg
收藏 1 评论3 发布时间:2014-12-16 19:36

举报

3个回答
沐紫 回答时间:2014-12-17 08:56:09
谢谢楼主!
wxh0000mm 回答时间:2014-12-17 09:04:43
好帖子必须顶一个!
woshilee 回答时间:2014-12-17 14:35:28

我这是应该做的,跟你比就小巫见大巫啦

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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