اطلاعیه

Collapse
No announcement yet.

ارتباط spi از طریق توابع hal با ماژول rc522

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ارتباط spi از طریق توابع hal با ماژول rc522

    با سلام و احترام
    در ارتباط برای خاندن رجیستر 0x37 که ویرایش ماژول است با استفاده از
    HAL_SPI_Transmit(&hspi1,d,1,20) و بعد از آن HAL_SPI_Receive(&hspi1,r,1,2000) معمولا دیتای خرابی دریافت می کنم که 0 یا ff است ولی وقتی دو بار HAL_SPI_TransmitReceive(&hspi1,d,r,2,2000);
    HAL_SPI_TransmitReceive(&hspi1,d,r,2,2000); را استفاده می کنم بار اول دیتا اشتباه است ولی دفعه بعد 92 هگز است که ویرایش است و بعد از آن هر بار که می خوانم عدد ویرایش درست است .
    چه تفاوتی بین این دو روش وجود دارد ؟
    بار اول 74 هگز جواب داده و بعد هر چند بار که سوال شده همان 92 و درست است .

    سوال بعدی :
    در صورتی که با تابع HAL_SPI_Transmit(&hspi1,d,2,2000); دتایی در رجیستری بنویسم به نظر می آید که دیتای mosi را در miso دریافت می کنم که خیلی عجیب است

    92 اولی جواب دستور قبلی است که همان ویرایش رو سوال کرده بودم و بعد از آن ..

    #2
    پاسخ : ارتباط spi از طریق توابع hal با ماژول rc522

    با سلام
    هنوز هم من از برنامه جواب نگرفته ام و حتی با یک برد دیگر هم تست کردم و فرقی نکرد
    به زبان خیلی ساده :
    در یک حلقه با دستوری مقدار رجیستر VersionReg یا همان 0x37 را می خوانم و فقط بار اول جواب 0x92 است و مابقی دفعات 0xee است واقعا عجیبه برای من
    کدها رو در ادامه قرار می دم :

    کد:
    void MX_SPI1_Init(void)
    {
    
        /* USER CODE BEGIN SPI1_Init 0 */
    
        /* USER CODE END SPI1_Init 0 */
    
        /* USER CODE BEGIN SPI1_Init 1 */
    
        /* USER CODE END SPI1_Init 1 */
        /* SPI1 parameter configuration*/
        hspi1.Instance = SPI1;
        hspi1.Init.Mode = SPI_MODE_MASTER;
        hspi1.Init.Direction = SPI_DIRECTION_2LINES;
        hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
        hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
        hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
        hspi1.Init.NSS =SPI_NSS_HARD_OUTPUT;// SPI_NSS_SOFT;
        hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
        hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
        hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
        hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
        hspi1.Init.CRCPolynomial = 7;
        //HAL_Delay(5);
        if (HAL_SPI_Init(&hspi1) != HAL_OK)
        {
            Error_Handler();
        }
        /* USER CODE BEGIN SPI1_Init 2 */
        //__HAL_SPI_ENABLE(&hspi1);
        /* USER CODE END SPI1_Init 2 */
    
    }
    کد:
    unsigned char ReadRawRC(unsigned char Address)
    {
        
        uint8_t val;
        uint8_t buf;
        HAL_GPIO_WritePin(RD_SS_Port, RD_SS_Pin, GPIO_PIN_RESET);
        buf = ((Address << 1) & 0x7E) | 0x80;
        if (HAL_SPI_Transmit(&hspi1, &buf, 1, 0xFFFF) == HAL_OK)
        {
            buf = MFRC522_DUMMY;
            HAL_SPI_TransmitReceive(&hspi1, &buf, &val, 1, 0xFFFF);
        }
        HAL_GPIO_WritePin(RD_SCK_Port, RD_SCK_Pin, GPIO_PIN_SET);
    return val;
        
        
    }
    کد:
    while (1)
    
            {
    
                status=ReadRawRC(VersionReg);
                printf(" version_reg=%x\r\n",status);
    
                HAL_Delay(4000);
            }
    کد:
    void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      if(hspi->Instance==SPI1)
      {
      /* USER CODE BEGIN SPI1_MspInit 0 */
    
      /* USER CODE END SPI1_MspInit 0 */
        /* Peripheral clock enable */
        __HAL_RCC_SPI1_CLK_ENABLE();
    
        __HAL_RCC_GPIOA_CLK_ENABLE();
        /**SPI1 GPIO Configuration
        PA5     ------> SPI1_SCK
        PA6     ------> SPI1_MISO
        PA7     ------> SPI1_MOSI
        */
        GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
      /* USER CODE BEGIN SPI1_MspInit 1 */
      //  HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
      //    HAL_NVIC_EnableIRQ(SPI1_IRQn);
      /* USER CODE END SPI1_MspInit 1 */
      }
    
    }
    
    /**
    خواهش می کنم اگر کسی می تونه کمکم کنه

    دیدگاه

    لطفا صبر کنید...
    X