找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2438|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

發(fā)現(xiàn)網(wǎng)上都找不到ADIS16203的源程序,在這里存下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)源程序如下:
  1. #include "adis16203.h"
  2. #include "halmain.h"
  3. #include "stm32f4xx_hal_spi.h"
  4. #include "stm32f4xx_hal_gpio.h"
  5. extern SPI_HandleTypeDef hspi2;
  6. ADIS16203_DATA_Typedef ADIS16203_DATA; //定義ADIS16203數(shù)據(jù)結(jié)構(gòu)體
  7. //bool write;
  8. //SPI2口初始化
  9. //這個(gè)spi初始化可以丟其他地方
  10. //hspi2在halmian.h有聲明
  11. void SPI2_Init(void)
  12. {
  13.     hspi2.Instance = SPI2;                                   //SPI2
  14.     hspi2.Init.Mode = SPI_MODE_MASTER;                       //設(shè)置SPI工作模式,設(shè)置為主模式
  15.     hspi2.Init.Direction = SPI_DIRECTION_2LINES;             //設(shè)置SPI單向或者雙向的數(shù)據(jù)模式:SPI設(shè)置為雙線模式
  16.     hspi2.Init.DataSize = SPI_DATASIZE_16BIT;                //設(shè)置SPI的數(shù)據(jù)大小:SPI發(fā)送接收16位幀結(jié)構(gòu)
  17.     hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;              //串行同步時(shí)鐘的空閑狀態(tài)為高電平
  18.     hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;                   //串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣
  19.     hspi2.Init.NSS = SPI_NSS_SOFT;                           //NSS信號(hào)由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號(hào)有SSI位控制
  20.     hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為64
  21.     hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;                  //指定數(shù)據(jù)傳輸從MSB位還是LSB位開(kāi)始:數(shù)據(jù)傳輸從MSB位開(kāi)始
  22.     hspi2.Init.TIMode = SPI_TIMODE_DISABLE;                  //關(guān)閉TI模式
  23.     hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;  //關(guān)閉硬件CRC校驗(yàn)
  24.     hspi2.Init.CRCPolynomial = 7;                            //CRC值計(jì)算的多項(xiàng)式
  25.                                                              //    HAL_SPI_Init(&hspi2);                                    //初始化
  26.     if (HAL_SPI_Init(&hspi2) != HAL_OK)
  27.     {
  28.         Error_Handler();
  29.     }
  30.     __HAL_SPI_ENABLE(&hspi2); //使能SPI2
  31. }

  32. /*SPI2底層驅(qū)動(dòng),時(shí)鐘使能,引腳配置
  33. void MY_SPI_MspInit(SPI_HandleTypeDef *hspi)
  34. {
  35.     GPIO_InitTypeDef GPIO_Initure;

  36.     __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB時(shí)鐘
  37.     __HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOB時(shí)鐘
  38.     __HAL_RCC_SPI2_CLK_ENABLE();  //使能SPI2時(shí)鐘

  39.     //PC3,PC2,PB10
  40.     GPIO_Initure.Pin = GPIO_PIN_2 | GPIO_PIN_3;
  41.     GPIO_Initure.Mode = GPIO_MODE_AF_PP;    //復(fù)用推挽輸出
  42.     GPIO_Initure.Pull = GPIO_PULLUP;        //上拉
  43.     GPIO_Initure.Speed = GPIO_SPEED_FAST;   //快速
  44.     GPIO_Initure.Alternate = GPIO_AF5_SPI2; //復(fù)用為SPI2
  45.     HAL_GPIO_Init(GPIOC, &GPIO_Initure);
  46.     GPIO_Initure.Pin = GPIO_PIN_10;
  47.     HAL_GPIO_Init(GPIOB, &GPIO_Initure);
  48. }
  49. */

  50. //SPI速度設(shè)置函數(shù)
  51. //SPI速度=fAPB1/分頻系數(shù)
  52. //@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
  53. //fAPB1時(shí)鐘一般為42Mhz:
  54. void SPI2_SetSpeed(uint8_t SPI_BaudRatePrescaler)
  55. {
  56.     assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); //判斷有效性
  57.     __HAL_SPI_DISABLE(&hspi2);                                      //關(guān)閉SPI
  58.     hspi2.Instance->CR1 &= 0XFFC7;                                  //位3-5清零,用來(lái)設(shè)置波特率
  59.     hspi2.Instance->CR1 |= SPI_BaudRatePrescaler;                   //設(shè)置SPI速度
  60.     __HAL_SPI_ENABLE(&hspi2);                                       //使能SPI
  61. }

  62. void ADIS16203_IO_Init(void)
  63. {
  64.     GPIO_InitTypeDef GPIO_InitStructure;
  65.     __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA時(shí)鐘
  66.     __HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOA時(shí)鐘,復(fù)位引腳

  67.     GPIO_InitStructure.Pin = SPI2_NSS_PIN; //定義spi2_cs片選引腳
  68.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  69.     GPIO_InitStructure.Pull = GPIO_PULLUP;
  70.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  71.     HAL_GPIO_Init(SPI2_NSS_IOPORT, &GPIO_InitStructure);
  72.     //初始為高電平,模塊為低電平有效,所以置高則不會(huì)被選取
  73.     HAL_GPIO_WritePin(SPI2_NSS_IOPORT, SPI2_NSS_PIN, GPIO_PIN_SET);

  74.     GPIO_InitStructure.Pin = ADIS16203_RST_PIN; //定義模塊復(fù)位引腳
  75.     HAL_GPIO_Init(ADIS16203_RST_IOPORT, &GPIO_InitStructure);
  76.     //模塊為低電平復(fù)位,先置高
  77.     HAL_GPIO_WritePin(ADIS16203_RST_IOPORT, ADIS16203_RST_PIN, GPIO_PIN_SET);
  78.     //官方庫(kù)自己已經(jīng)定義好了,在f4xx_hal_msp.c中關(guān)于msio,mosi,sck的引腳配置。關(guān)于中斷修改優(yōu)先級(jí)即可
  79.     HAL_SPI_MspInit(hspi2);
  80. }

  81. //模塊初始化
  82. void ADIS16203_Init(void)
  83. {
  84.     SPI2_Init();           //SPI2初始化
  85.     ADIS16203_IO_Init() ; //IO初始化
  86. }

  87. //模塊復(fù)位函數(shù)
  88. void ADIS16203Reset(void)
  89. {
  90.     HAL_GPIO_WritePin(ADIS16203_RST_IOPORT, ADIS16203_RST_PIN, GPIO_PIN_RESET);
  91.     DelayMs(1);
  92.     HAL_GPIO_WritePin(ADIS16203_RST_IOPORT, ADIS16203_RST_PIN, GPIO_PIN_SET);
  93.     DelayMs(6);
  94. }

  95. //TxData:要寫入字節(jié)
  96. //返回值:讀出的字節(jié)
  97. //一次傳輸量為16bit,所以只傳輸一次
  98. uint16_t SPI2_ReadWriteByte(uint8_t COM, bool write)
  99. {
  100.     uint16_t TxData, Rxdata;
  101.     {
  102.         if (write == true)
  103.             TxData = (COM << 8) + (1 << 15);
  104.         else
  105.             TxData = (COM << 8) + 0;
  106.     }
  107.     HAL_SPI_TransmitReceive(&hspi2, (uint8_t *)(&TxData), (uint8_t *)(&Rxdata), 1, 1000);
  108.     return Rxdata;
  109. }

  110. void ADIS16203_CS_LOW(void) //片選信號(hào)拉低,片選有效
  111. {
  112.     HAL_GPIO_WritePin(SPI2_NSS_IOPORT, SPI2_NSS_PIN, GPIO_PIN_RESET);
  113. }

  114. void ADIS16203_CS_HIGH(void) //片選信號(hào)拉高,片選無(wú)效
  115. {
  116.     HAL_GPIO_WritePin(SPI2_NSS_IOPORT, SPI2_NSS_PIN, GPIO_PIN_SET);
  117. }
  118. //取讀模塊數(shù)據(jù)(無(wú)返回值類型)
  119. void READ_ADIS16203_DATA(uint8_t COM, ADIS16203_DATA_Typedef *ADIS_DATA, bool wr)
  120. {
  121.     ADIS16203_CS_LOW();
  122.     SPI2_ReadWriteByte(COM, wr);
  123.     ADIS16203_CS_HIGH();
  124.     delay_us(10);
  125.     ADIS16203_CS_LOW();
  126.     switch (COM)
  127.     {
  128.     case SUPPLY_OUT:
  129.         ADIS_DATA->SUPPLY_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0xfff) * 1.22);
  130.         break;
  131.     case AUX_ADC:
  132.         ADIS_DATA->AUX_ADC_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0xfff) * 0.61);
  133.         break;
  134.     case TEMP_OUT:
  135.         ADIS_DATA->TEMP_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0xfff) * -0.47); //這個(gè)要注意下
  136.         break;
  137.     case INCL_OUT:
  138.         ADIS_DATA->INCL_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0x3fff) * 0.025);
  139.         break;
  140.     case INCL_180_OUT:
  141.         ADIS_DATA->INCL_180_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0x3fff) * 0.025);
  142.         break;
  143.     default:
  144.         break;
  145.     }
  146.     ADIS16203_CS_HIGH();
  147. }

  148. //取讀模塊數(shù)據(jù)(有返回值類型),還得進(jìn)一步處理
  149. uint16_t READ_ADIS16203_DATA2(uint8_t COM, bool wr)
  150. {
  151.     uint16_t ret;
  152.     ADIS16203_CS_LOW();
  153.     SPI2_ReadWriteByte(COM, wr);
  154.     ADIS16203_CS_HIGH();
  155.     delay_us(10);
  156.     ADIS16203_CS_LOW();
  157.     ret = SPI2_ReadWriteByte(COM, wr);
  158.     ADIS16203_CS_HIGH();
  159.     return ret;
  160. }

  161. uint16_t
復(fù)制代碼


全部資料51hei下載地址:
ADIS16203.zip (3.55 KB, 下載次數(shù): 22)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:228452 發(fā)表于 2022-4-5 04:40 | 只看該作者
Excellent component
14-bit digital inclination outputs

Thank you
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表