Advertisement
petrdynin

CH32V307_SPI_HardNSS

Jan 19th, 2024 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.58 KB | None | 0 0
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : main.c
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2021/06/06
  6. * Description        : Main program body.
  7. *********************************************************************************
  8. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  9. * Attention: This software (modified or not) and binary are used for
  10. * microcontroller manufactured by Nanjing Qinheng Microelectronics.
  11. *******************************************************************************/
  12.  
  13. /*
  14.  *@Note
  15.  USART Print debugging routine:
  16.  USART1_Tx(PA9).
  17.  This example demonstrates using USART1(PA9) as a print debug port output.
  18.  
  19. */
  20.  
  21. #include "debug.h"
  22.  
  23.  
  24. /* Global typedef */
  25.  
  26. /* Global define */
  27.  
  28. /* Global Variable */
  29.  
  30. void SPI1_Init(){
  31.     RCC->APB2PCENR  |= RCC_APB2Periph_GPIOA;
  32.     //SPI1_NSS(PA4 GPIO_Mode_AF_PP)
  33.     GPIOA->CFGLR  = (GPIOA->CFGLR & ~ GPIO_CFGLR_CNF4_0) | GPIO_CFGLR_CNF4_1;
  34.     GPIOA->CFGLR |= GPIO_CFGLR_MODE4;
  35.     GPIOA->BSHR = GPIO_BSHR_BS4;
  36.     //SPI1_SCK(PA5 GPIO_Mode_AF_PP)
  37.     GPIOA->CFGLR  = (GPIOA->CFGLR & ~ GPIO_CFGLR_CNF5_0)|(GPIO_CFGLR_CNF5_1);
  38.     GPIOA->CFGLR |= GPIO_CFGLR_MODE5;
  39.     //SPI1_MOSI(PA7 GPIO_Mode_AF_PP)
  40.     GPIOA->CFGLR  = (GPIOA->CFGLR & ~(GPIO_CFGLR_CNF7_0))|(GPIO_CFGLR_CNF7_1);
  41.     GPIOA->CFGLR |= GPIO_CFGLR_MODE7;
  42.     //SPI1_MISO(PA6 GPIO_Mode_IN_FLOATING)
  43.     GPIOA->CFGLR = (GPIOA->CFGLR & ~(GPIO_CFGLR_CNF6_0))|(GPIO_CFGLR_CNF6_1);
  44.     GPIOA->CFGLR = GPIOA->CFGLR & ~GPIO_CFGLR_MODE6;
  45.     // Настройка SPI1
  46.     RCC->APB2PCENR  |= RCC_APB2Periph_SPI1;     // вкл. тактирование SPI1
  47.     SPI1->CTLR1 |= SPI_CTLR1_MSTR;              // вкл. МАСТЕР
  48.     SPI1->CTLR1 |= SPI_BaudRatePrescaler_64;    //
  49.     SPI1->CTLR1 &= ~SPI_CTLR1_SSM;              // Hard_NSS
  50.     SPI1->CTLR2 |= SPI_CTLR2_SSOE;              // включаем драйвер NSS
  51.     //SPI1->CTLR1 |= SPI_CTLR1_SPE; // вкл SPI
  52. }
  53.  
  54.  
  55. void SPIx_Init(void)
  56. {
  57.     SPI_InitTypeDef  SPI_InitStructure;
  58.     GPIO_InitTypeDef GPIO_InitStructure;
  59.  
  60.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO| RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  61.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ,ENABLE);
  62.  
  63.     // SPI1_SCK & SPI1_MOSI
  64.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
  65.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  67.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  68.  
  69.     //SPI1_NSS
  70.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  71.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  72.  
  73.     //SPI1_MOSI
  74.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  75.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  76.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  77.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  78.  
  79.     //SPI1
  80.     //GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);
  81.  
  82.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  83.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  84.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  85.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  86.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  87.     SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
  88.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  89.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  90.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  91.     SPI_Init(SPI1, &SPI_InitStructure);
  92.     SPI_SSOutputCmd(SPI1, ENABLE);
  93.  
  94.     SPI_Cmd(SPI1, ENABLE);
  95. }
  96.  
  97.  
  98.  
  99.  
  100. uint8_t Spi1_Write_Data(uint8_t data)
  101. {
  102.     //SPI1->CTLR1 |= SPI_CTLR1_SPE;
  103.     while(!(SPI1->STATR & SPI_STATR_TXE));   //ждём пока опустошится Tx буфер
  104.     //CS_LOW();
  105.     SPI1->DATAR = (uint8_t)data;             //отправляем данные
  106.     //while(!(SPI1->STATR & SPI_STATR_RXNE));  //ждём пока придёт ответ
  107.     //data = (uint8_t)(SPI1->DATAR);           //считываем полученные данные
  108.     //CS_HIGH();
  109.     //SPI1->CTLR1 &= ~SPI_CTLR1_SPE;
  110.     return data;
  111. }
  112.  
  113. /*********************************************************************
  114.  * @fn      main
  115.  *
  116.  * @brief   Main program.
  117.  *
  118.  * @return  none
  119.  */
  120. int main(void)
  121. {
  122.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  123.     SystemCoreClockUpdate();
  124.     Delay_Init();
  125.     USART_Printf_Init(115200); 
  126.     printf("SystemClk:%d\r\n",SystemCoreClock);
  127.     printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
  128.     printf("Test SPI Hard_NSS\r\n");
  129.  
  130.     SPI1_Init();
  131.     //SPIx_Init();
  132.  
  133.         while(1)
  134.         {
  135.             Spi1_Write_Data(0x55);
  136.             Delay_Us(20);
  137.         }
  138. }
  139.  
  140.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement