|
單片機(jī)源程序如下:- #include "adis16203.h"
- #include "halmain.h"
- #include "stm32f4xx_hal_spi.h"
- #include "stm32f4xx_hal_gpio.h"
- extern SPI_HandleTypeDef hspi2;
- ADIS16203_DATA_Typedef ADIS16203_DATA; //定義ADIS16203數(shù)據(jù)結(jié)構(gòu)體
- //bool write;
- //SPI2口初始化
- //這個(gè)spi初始化可以丟其他地方
- //hspi2在halmian.h有聲明
- void SPI2_Init(void)
- {
- hspi2.Instance = SPI2; //SPI2
- hspi2.Init.Mode = SPI_MODE_MASTER; //設(shè)置SPI工作模式,設(shè)置為主模式
- hspi2.Init.Direction = SPI_DIRECTION_2LINES; //設(shè)置SPI單向或者雙向的數(shù)據(jù)模式:SPI設(shè)置為雙線模式
- hspi2.Init.DataSize = SPI_DATASIZE_16BIT; //設(shè)置SPI的數(shù)據(jù)大小:SPI發(fā)送接收16位幀結(jié)構(gòu)
- hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; //串行同步時(shí)鐘的空閑狀態(tài)為高電平
- hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; //串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣
- hspi2.Init.NSS = SPI_NSS_SOFT; //NSS信號(hào)由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號(hào)有SSI位控制
- hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為64
- hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; //指定數(shù)據(jù)傳輸從MSB位還是LSB位開(kāi)始:數(shù)據(jù)傳輸從MSB位開(kāi)始
- hspi2.Init.TIMode = SPI_TIMODE_DISABLE; //關(guān)閉TI模式
- hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //關(guān)閉硬件CRC校驗(yàn)
- hspi2.Init.CRCPolynomial = 7; //CRC值計(jì)算的多項(xiàng)式
- // HAL_SPI_Init(&hspi2); //初始化
- if (HAL_SPI_Init(&hspi2) != HAL_OK)
- {
- Error_Handler();
- }
- __HAL_SPI_ENABLE(&hspi2); //使能SPI2
- }
- /*SPI2底層驅(qū)動(dòng),時(shí)鐘使能,引腳配置
- void MY_SPI_MspInit(SPI_HandleTypeDef *hspi)
- {
- GPIO_InitTypeDef GPIO_Initure;
- __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB時(shí)鐘
- __HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOB時(shí)鐘
- __HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2時(shí)鐘
- //PC3,PC2,PB10
- GPIO_Initure.Pin = GPIO_PIN_2 | GPIO_PIN_3;
- GPIO_Initure.Mode = GPIO_MODE_AF_PP; //復(fù)用推挽輸出
- GPIO_Initure.Pull = GPIO_PULLUP; //上拉
- GPIO_Initure.Speed = GPIO_SPEED_FAST; //快速
- GPIO_Initure.Alternate = GPIO_AF5_SPI2; //復(fù)用為SPI2
- HAL_GPIO_Init(GPIOC, &GPIO_Initure);
- GPIO_Initure.Pin = GPIO_PIN_10;
- HAL_GPIO_Init(GPIOB, &GPIO_Initure);
- }
- */
- //SPI速度設(shè)置函數(shù)
- //SPI速度=fAPB1/分頻系數(shù)
- //@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
- //fAPB1時(shí)鐘一般為42Mhz:
- void SPI2_SetSpeed(uint8_t SPI_BaudRatePrescaler)
- {
- assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); //判斷有效性
- __HAL_SPI_DISABLE(&hspi2); //關(guān)閉SPI
- hspi2.Instance->CR1 &= 0XFFC7; //位3-5清零,用來(lái)設(shè)置波特率
- hspi2.Instance->CR1 |= SPI_BaudRatePrescaler; //設(shè)置SPI速度
- __HAL_SPI_ENABLE(&hspi2); //使能SPI
- }
- void ADIS16203_IO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA時(shí)鐘
- __HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOA時(shí)鐘,復(fù)位引腳
- GPIO_InitStructure.Pin = SPI2_NSS_PIN; //定義spi2_cs片選引腳
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStructure.Pull = GPIO_PULLUP;
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(SPI2_NSS_IOPORT, &GPIO_InitStructure);
- //初始為高電平,模塊為低電平有效,所以置高則不會(huì)被選取
- HAL_GPIO_WritePin(SPI2_NSS_IOPORT, SPI2_NSS_PIN, GPIO_PIN_SET);
- GPIO_InitStructure.Pin = ADIS16203_RST_PIN; //定義模塊復(fù)位引腳
- HAL_GPIO_Init(ADIS16203_RST_IOPORT, &GPIO_InitStructure);
- //模塊為低電平復(fù)位,先置高
- HAL_GPIO_WritePin(ADIS16203_RST_IOPORT, ADIS16203_RST_PIN, GPIO_PIN_SET);
- //官方庫(kù)自己已經(jīng)定義好了,在f4xx_hal_msp.c中關(guān)于msio,mosi,sck的引腳配置。關(guān)于中斷修改優(yōu)先級(jí)即可
- HAL_SPI_MspInit(hspi2);
- }
- //模塊初始化
- void ADIS16203_Init(void)
- {
- SPI2_Init(); //SPI2初始化
- ADIS16203_IO_Init() ; //IO初始化
- }
- //模塊復(fù)位函數(shù)
- void ADIS16203Reset(void)
- {
- HAL_GPIO_WritePin(ADIS16203_RST_IOPORT, ADIS16203_RST_PIN, GPIO_PIN_RESET);
- DelayMs(1);
- HAL_GPIO_WritePin(ADIS16203_RST_IOPORT, ADIS16203_RST_PIN, GPIO_PIN_SET);
- DelayMs(6);
- }
- //TxData:要寫入字節(jié)
- //返回值:讀出的字節(jié)
- //一次傳輸量為16bit,所以只傳輸一次
- uint16_t SPI2_ReadWriteByte(uint8_t COM, bool write)
- {
- uint16_t TxData, Rxdata;
- {
- if (write == true)
- TxData = (COM << 8) + (1 << 15);
- else
- TxData = (COM << 8) + 0;
- }
- HAL_SPI_TransmitReceive(&hspi2, (uint8_t *)(&TxData), (uint8_t *)(&Rxdata), 1, 1000);
- return Rxdata;
- }
- void ADIS16203_CS_LOW(void) //片選信號(hào)拉低,片選有效
- {
- HAL_GPIO_WritePin(SPI2_NSS_IOPORT, SPI2_NSS_PIN, GPIO_PIN_RESET);
- }
- void ADIS16203_CS_HIGH(void) //片選信號(hào)拉高,片選無(wú)效
- {
- HAL_GPIO_WritePin(SPI2_NSS_IOPORT, SPI2_NSS_PIN, GPIO_PIN_SET);
- }
- //取讀模塊數(shù)據(jù)(無(wú)返回值類型)
- void READ_ADIS16203_DATA(uint8_t COM, ADIS16203_DATA_Typedef *ADIS_DATA, bool wr)
- {
- ADIS16203_CS_LOW();
- SPI2_ReadWriteByte(COM, wr);
- ADIS16203_CS_HIGH();
- delay_us(10);
- ADIS16203_CS_LOW();
- switch (COM)
- {
- case SUPPLY_OUT:
- ADIS_DATA->SUPPLY_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0xfff) * 1.22);
- break;
- case AUX_ADC:
- ADIS_DATA->AUX_ADC_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0xfff) * 0.61);
- break;
- case TEMP_OUT:
- ADIS_DATA->TEMP_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0xfff) * -0.47); //這個(gè)要注意下
- break;
- case INCL_OUT:
- ADIS_DATA->INCL_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0x3fff) * 0.025);
- break;
- case INCL_180_OUT:
- ADIS_DATA->INCL_180_OUT_DATA = ((SPI2_ReadWriteByte(COM, wr) & 0x3fff) * 0.025);
- break;
- default:
- break;
- }
- ADIS16203_CS_HIGH();
- }
- //取讀模塊數(shù)據(jù)(有返回值類型),還得進(jìn)一步處理
- uint16_t READ_ADIS16203_DATA2(uint8_t COM, bool wr)
- {
- uint16_t ret;
- ADIS16203_CS_LOW();
- SPI2_ReadWriteByte(COM, wr);
- ADIS16203_CS_HIGH();
- delay_us(10);
- ADIS16203_CS_LOW();
- ret = SPI2_ReadWriteByte(COM, wr);
- ADIS16203_CS_HIGH();
- return ret;
- }
- uint16_t
復(fù)制代碼
51hei.png (4.75 KB, 下載次數(shù): 46)
下載附件
2021-1-16 16:04 上傳
全部資料51hei下載地址:
ADIS16203.zip
(3.55 KB, 下載次數(shù): 22)
2021-1-16 13:42 上傳
點(diǎn)擊文件名下載附件
可能有問(wèn)題 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|