4891|2

66

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

USART 同步模式接收不到数据 求助版主 [复制链接]

用STM32在做一个小设计时;把SPI全用光了,然后就用了USART的同步模式;
现在问题是这样,主机可以发送数据,从机可以反应并且在总线上发出数据。但是STM32RXNE始终为0 接收不到数据;有搞过的可以分析一下什么问题啊?
谢谢!
付调试波形

 SCK 与 MOSI     主机发送命令0xff  与发送0X10;

0x10细节;


SCK 与 MISO     主机返回状态  与我预先要得到的0x83

0x83 说明从机肯定有用 工作了;

附程序
void WIRELESS_SPI_Init(void)
{  

        GPIO_InitTypeDef GPIO_InitStructure;
        
        /* 定义USART初始化结构体 USART_InitStructure */
         USART_InitTypeDef USART_InitStructure;
       /* 定义USART初始化结构体 USART_ClockInitStructure */        
        USART_ClockInitTypeDef  USART_ClockInitStructure;
        
    // Enable USART2 and GPIO clocks
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);// GPIOD USART2 remap

    ////USART2口初始化 Set PORTD 5,7  as Output push-pull - SCK and MOSI
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_1Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable;
USART_ClockInit(USART2 , &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate =2000000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl =  USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2 , &USART_InitStructure);
   
   /* 使能USART1 */
   USART_Cmd(USART2 , ENABLE);
}  
//********************************************USART2配置****************************



u8 SPI_ReadWriteByte(u8 TxData)                                        //SPI读写数据函数
{ u8 tx=0;
u8 retry=0;
        u8 re=0;
        u8 re2=0;
        
//  LSB to MSB //      
  for(u8 i=0;i<8;i++)
    {
  if(TxData&0x80)
          tx|=0x80;
          if(i!=7)tx>>=1;
    TxData<<=1;
    }
/* Loop while DR register in not emplty */
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)      //发送缓存标志位为空
  {
  retry++;
  if(retry>200)return 0;
  }     
/* Send   tx */
USART_SendData(USART2, tx);                                    //发送一个数据
/* Wait to receive a byte */
while (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET)  //接收缓存标志位不为空
        {
        }
// Return the byte read from the SPI bus
                           
   
      return USART_ReceiveData(USART2);   //返回接收数据
}


//***************************************读写程序***************

测试程序

void test1(void)
{ u8 st1,st2,st3;
// SPI_ReadWriteByte(SPI_WRITE_REG+TX_ADDR);
  NRF24L01_Write_Reg(SPI_WRITE_REG+TX_ADDR,0x83);

  while(1)
  {
   st1= NRF24L01_Read_Reg(TX_ADDR);
  }
  
}



//通过SPI写寄存器
u8 NRF24L01_Write_Reg(u8 regaddr,u8 data)
{
u8 status;
    Clr_NRF24L01_CSN;                    //使能SPI传输
   status =SPI_ReadWriteByte(regaddr); //发送寄存器号
   SPI_ReadWriteByte(data);            //写入寄存器的值
                      //禁止SPI传输   
   return(status);                  //返回状态值
}
//读取SPI寄存器值 ,regaddr:要读的寄存器
u8 NRF24L01_Read_Reg(u8 regaddr)
{
u8 reg_val;     
  Clr_NRF24L01_CSN;                //使能SPI传输  
   SPI_ReadWriteByte(regaddr);     //发送寄存器号
   reg_val=SPI_ReadWriteByte(0XFF);//读取寄存器内容
   Set_NRF24L01_CSN;                //禁止SPI传输      
   return(reg_val);                 //返回状态值
}



程序就阻在这!
while (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET)  //接收缓存标志位不为空

我检查了 STM32 硬件这几个引脚肯定是可靠连接了;
我降低了速率,还是这个样!
不知道再重哪里入手了!求助  求助  求助 !头大了!

[ 本帖最后由 shirl 于 2012-8-19 14:54 编辑 ]
此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报

66

帖子

4

TA的资源

一粒金砂(中级)

沙发
 
附官方 同步模式主要程序!

GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USARTy TX and USARTy CK pins as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = USARTy_TxPin | USARTy_ClkPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);


  /* Configure USARTy RX as input floating */
  GPIO_InitStructure.GPIO_Pin = USARTy_RxPin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(USARTy_GPIO_CLK | SPIy_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);

  /* Enable USARTy Clock */
  RCC_APB2PeriphClockCmd(USARTy_CLK, ENABLE);


  USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;
  USART_ClockInitStructure.USART_CPOL = USART_CPOL_High;
  USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
  USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable;
  USART_ClockInit(USARTy, &USART_ClockInitStructure);

  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No ;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USARTy, &USART_InitStructure);
  
  /* Configure the USARTy */
  USART_Init(USARTy, &USART_InitStructure);

  /* Enable the USARTy */
  USART_Cmd(USARTy, ENABLE);


  USART_SendData(USARTy, DYMMY_BYTE);
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET)
    {
    }
    /* Wait the byte is entirely received by USARTy */
    while(USART_GetFlagStatus(USARTy, USART_FLAG_RXNE) == RESET)
    {
    }
    /* Store the received byte in the RxBuffer1 */
    RxBuffer1[RxCounter1++] = USART_ReceiveData(USARTy);
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

4

TA的资源

一粒金砂(中级)

板凳
 
哎!  过了 !就过了!
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表