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

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
谢谢楼主!
子曰小玖 回答时间:2014-12-17 09:04:43
好帖子必须顶一个!
woshilee 回答时间:2014-12-17 14:35:28

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

所属标签

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