野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13643|回复: 1

STM32F103VET6驱动SI4432的问题

[复制链接]
发表于 2015-5-28 10:53:02 | 显示全部楼层 |阅读模式
请问各位做过这类通讯的高手们,为什么我用STM32驱动SI4432的时候,全速运行收发就是失败,失败原因是因为没有收发中断,没有收发中断就意味着没有数据。而我单步运行的时候,有收发中断,有正确的收发数据。请问这是怎么一回事?(SPI是没有问题的)
void communication_test()
{
        unsigned char TxBuf[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
  unsigned char RxBuf[10];
        if(KEY_Scan())
        {
                RSSI_Check();
                printf("¿aê¼ò»¸ö°′¼ü·¢ËíêμÑé\r\n");
                SetTx_Mode();
                SI4432_TX(TxBuf,10);
                SetRx_Mode();
                printf("òÑ×Ô¶ˉéèÖÃÎa½óêÕÄ£ê½\r\n");
                Delay_ms(5);
        }
if(SI4432_RX(RxBuf,10))
{
        printf("½óêÕμ½êy¾Y£¬μè′yD£Ñé...\r\n");
        for(i=0;i<10;i++)
        {
                if(RxBuf[i] == TxBuf[i])
                {
                        check_num++;
                }
        }
        if(check_num>8)
        {
                printf("the recive data:");
                for(i=0;i<10;i++)
          {
      printf("%c",RxBuf[i]);
    }
                printf("&#188;ì2éíê±&#207;...\r\n");
        }
}
SetRx_Mode();
}






void SetTx_Mode()
{
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_1,0x01);//Ready
        Delay_ms(5);
  TX1_RX0;
        Delay_ms(5);
       
        printf("ò&#209;éè&#214;&#195;&#206;a·¢é&#228;&#196;£ê&#189;\r\n");
       
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_2,SI4432_Read_Register(OPERATING_FUNCTION_CONTROL_2)|0x01);
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_2,SI4432_Read_Register(OPERATING_FUNCTION_CONTROL_2)&0xFE);//·¢é&#228;FIFO&#199;&#229;0       
       
        Itstatus1 = SI4432_Read_Register(INTERRUPT_STATUS_1);
        Itstatus2 = SI4432_Read_Register(INTERRUPT_STATUS_2);        //&#199;&#229;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
       
        SI4432_Write_Register(INTERRUPT_ENABLE_1,0x04);//ê1&#196;üía2&#191;&#214;D&#182;&#207;
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_1,0x09);//ê1&#196;ü·¢é&#228;&#196;£ê&#189;
}       
       



void SI4432_TX(unsigned char *TX_DataBuf,u8 Tx_Len)
{

        uint8_t Time_out = 0;
       

        SI4432_Write_Register(PREAMBLE_LENGTH,40);
        SI4432_Write_Register(TRANSMIT_PACKET_LENGTH,Tx_Len);       

       
        SPI_Write_Buffer(0x7F,TX_DataBuf,Tx_Len);
        Delay_ms(5);
       
        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11))
        {
                Time_out++;
                if(Time_out >= Waiting_Time)
                {
                        printf("·¢&#203;í꧰ü\r\n");
                        Time_out = 0;
                        Delay_ms(10);
                        SI4432_Init();
                        break;
                }
        }
        if(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)))
        {
                Itstatus1 = SI4432_Read_Register(INTERRUPT_STATUS_1);
                printf("\r\nItstatus1=%c\r\n",Itstatus1);
                if((Itstatus1 & 0x04) == 0x04)
                                {
                                        Itstatus1 = 0;
                                        printf("·¢&#203;í3é1|\r\n");
              }
                                else
                                {
                                        printf("·¢&#203;í꧰ü\r\n");
                                }
  }
}
                       



void SetRx_Mode()
{
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_1,0x01);//Ready
        Delay_ms(5);
        TX0_RX1;//D&#190;&#198;&#172;·&#189;&#207;ò
        Delay_ms(5);
       
       
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_2,SI4432_Read_Register(OPERATING_FUNCTION_CONTROL_2)|0x02);
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_2,SI4432_Read_Register(OPERATING_FUNCTION_CONTROL_2)&0xFD);//&#189;óê&#213;&#199;&#229;0
               
        Itstatus1 = SI4432_Read_Register(INTERRUPT_STATUS_1);
        Itstatus2 = SI4432_Read_Register(INTERRUPT_STATUS_2);        //&#199;&#229;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
       
        SI4432_Write_Register(INTERRUPT_ENABLE_1,0x02);//ê1&#196;üía2&#191;&#214;D&#182;&#207;
        SI4432_Write_Register(OPERATING_FUNCTION_CONTROL_1,0x05);//ê1&#196;ü&#189;óê&#213;&#196;£ê&#189;
}

       



u8 SI4432_RX(unsigned char *RX_DataBuf,u8 length)
{
       
        uint8_t Rx_Flag = 0;

        if(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)))
        {
                Itstatus1 = SI4432_Read_Register(INTERRUPT_STATUS_1);
                if((Itstatus1 & 0x02) == 0x02)
                        {
                                SPI_Read_Buffer(0x7F,RX_DataBuf,length);
                                Rx_Flag = 1;
                        }
                        else
                                {
                                        Rx_Flag = 0;
                                }
        }
return Rx_Flag;       
}



void RSSI_Check()
{
        u8 RSSI;
        SetRx_Mode();
        printf("\r\nD&#197;o&#197;&#199;&#191;&#182;è:");
        RSSI=SI4432_Read_Register(0x26);
        printf("%d\r\n",RSSI);
}
       

回复

使用道具 举报

发表于 2015-5-29 09:44:02 | 显示全部楼层
看看通讯的时序符不符合要求,可能延时不够
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-20 17:34 , Processed in 0.032285 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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