질문게시판 > spi로 센서 값 읽어오기 해보신분 계신가요?

TODAY206 TOTAL2,592,727
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | spi로 센서 값 읽어오기 해보신분 계신가요?

페이지 정보

작성자 라칸 작성일2022-11-14 16:57 조회807회 댓글1건

본문

	

spi로 센서값 읽어오기를 하고 있는데

spi 1개에 센서 여러개가 연결되어있어서 어려움을 겪고 있는데

 

간신히 예제를 찾아서 일단 해보려고 했는데

값이 이상하게 나와서요 42'xxx, 60'xxx, 0 이런값이 반복만 되고 있는데 이거 보면 그냥 측정 값 자체를 못가져온거 같은데

일단 센서로 측정하는게 다르더라도(전압, 온도, 습도 등등) 주소가 맞으면 센서의 값을 읽어오는게 아닌가요?

심지어 센서는 2~3개 연결했고 연결 안한곳도 있는데 다 똑같이 증상이라서요

 

뭐가 문제인지 알려주실수 있으신가요?

SPI_CHN_RANGE하고 SPI_CHANNEL 바꾸거나 다 똑같이 반응하더군요

 

그냥 채널 설정이 문제인지 아니면  read가 문제인지 진짜 모르겠습니다

 

참고 주소: https://github.com/obatsis/ADS8688-STM32

spi datasheet : https://www.ti.com/lit/ds/symlink/ads8688.pdf?ts=1668384265698&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FADS8688%253Fdcmp%253Ddsproject%2526hqs%253Dpf 

 

 

코드

[code]

#define SPI_CONT 0x00

#define SPI_STBY 0x82

#define SPI_PWDN 0x83

#define SPI_RST 0x85

#define SPI_AUTO_RST 0xA0

#define SPI_CHANNEL_0 0xC0

#define SPI_CHANNEL_1 0xC4

#define SPI_CHANNEL_2 0xC8

#define SPI_CHANNEL_3 0xCC

#define SPI_CHANNEL_4 0xD0

#define SPI_CHANNEL_5 0xD4

#define SPI_CHANNEL_6 0xD8

#define SPI_CHANNEL_7 0xDC

 

// Register addresses

#define SPI_AUTO_SEQ_EN 0x01

#define SPI_CHN_PWRDN 0x02

#define SPI_FEATURE_SELECT 0x03

 

#define SPI_CHN_RANGE_0 0x05

#define SPI_CHN_RANGE_1 0x06

#define SPI_CHN_RANGE_2 0x07

#define SPI_CHN_RANGE_3 0x08

#define SPI_CHN_RANGE_4 0x09

#define SPI_CHN_RANGE_5 0x0A

#define SPI_CHN_RANGE_6 0x0B

#define SPI_CHN_RANGE_7 0x0C

 

#define CMD_RD_BCK 0x3f

 

// --------------------------------------------------------------------------- //

 

#define CHNS_NUM_READ 8

 

uint8_t SPI_ADS_Init(SPI_ADS *ads, SPI_HandleTypeDef *spiHandle, GPIO_TypeDef *csPinBank, uint16_t csPin) {

/* Store interface parameters in struct */

ads->spiHandle = spiHandle;

ads->csPinBank = csPinBank;

ads->csPin = csPin;

 

uint8_t ads_data[2] = {0};

uint8_t state = 0;

 

// reset all registers to default

state += SPI_Cmd_Write(ads, SPI_RST, ads_data);

HAL_Delay(100);

 

// send a no_op message to the ADS to enter IDLE mode

state += SPI_Cmd_Write(ads, SPI_CONT, ads_data);

HAL_Delay(10);

 

// enable auto transmit for all inputs(datasheet page 54) or as many as you want

// if you want only some of the inputs enabled, make sure to power down the unused ones

ads_data[0] = 0xff;

state += SPI_Prog_Write(ads, SPI_AUTO_SEQ_EN, ads_data);

HAL_Delay(10);

 

        

// set the desired features such as device id (if multiple devices are used), alarm enable/disable and output format

ads_data[0] = 0x00; // here i chose id = 0, alarm = disabled and SDO_format = 3 (datasheet page 56)

state += SPI_Prog_Write(ads, SPI_FEATURE_SELECT, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x06;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_0, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x06;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_1, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x05;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_2, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x05;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_3, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x05;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_4, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x05;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_5, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x06;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_6, ads_data);

HAL_Delay(10);

 

ads_data[0] = 0x06;

state += SPI_Prog_Write(ads, SPI_CHN_RANGE_7, ads_data);

HAL_Delay(10);

 

// start the auto transmission by entering the appropriate state

state += SPI_Cmd_Write(ads, SPI_AUTO_RST, ads_data);

 

return state;

}

 

HAL_StatusTypeDef SPI_Prog_Read(SPI_ADS *ads, uint8_t addr, uint8_t *data) {

HAL_StatusTypeDef ret;

uint8_t txbuf[2] = {0x00, (addr<<1 & 0xfe)}; // [15:9]->address, [8]->0, [7:0]->don't care (0x00) (stm32 uses little endian so reverse it)

uint8_t rxbuf[4];

 

HAL_GPIO_WritePin(ads->csPinBank, ads->csPin, GPIO_PIN_RESET);

ret = HAL_SPI_TransmitReceive(ads->spiHandle, txbuf, rxbuf, 2, 10);

HAL_GPIO_WritePin(ads->csPinBank, ads->csPin, GPIO_PIN_SET);

 

data[0] = rxbuf[2];

data[1] = rxbuf[3];

return ret;

}

 

// after the write, data should contain the data (byte) written to the addressed register (check equality for evaluation)

HAL_StatusTypeDef SPI_Prog_Write(SPI_ADS *ads, uint8_t addr, uint8_t *data) {

HAL_StatusTypeDef ret;

uint8_t txbuf[2] = {data[0], (addr << 1 | 0x01)}; // [15:9]->address[6:0], [8]->1, [7:0]->data[7:0] (stm32 uses little endian so reverse it)

uint8_t rxbuf[4];

 

HAL_GPIO_WritePin(ads->csPinBank, ads->csPin, GPIO_PIN_RESET);

ret = HAL_SPI_TransmitReceive(ads->spiHandle, txbuf, rxbuf, 2, 10);

HAL_GPIO_WritePin(ads->csPinBank, ads->csPin, GPIO_PIN_SET);

 

data[0] = rxbuf[3];

data[1] = 0x00;

return ret;

}

 

HAL_StatusTypeDef SPI_Cmd_Write(SPI_ADS *ads, uint8_t cmd, uint8_t *data) {

HAL_StatusTypeDef ret;

uint8_t txbuf[2] = {0x00,cmd}; // [15:9]->address[6:0], [8]->1, [7:0]->data[7:0] (stm32 uses little endian so reverse it)

uint8_t rxbuf[4];

 

HAL_GPIO_WritePin(ads->csPinBank, ads->csPin, GPIO_PIN_RESET);

ret = HAL_SPI_TransmitReceive(ads->spiHandle, txbuf, rxbuf, 2, 10);

HAL_GPIO_WritePin(ads->csPinBank, ads->csPin, GPIO_PIN_SET);

 

data[0] = rxbuf[2];

data[1] = rxbuf[3];

return ret;

}

 

HAL_StatusTypeDef SPI_Read_All_Raw(SPI_ADS *ads, uint16_t *data) {

HAL_StatusTypeDef ret;

uint8_t ads_raw[2];

for(int i=0; i < CHNS_NUM_READ; i++) {

  ret = SPI_Cmd_Write(ads, SPI_CONT, ads_raw);

  data[i] = (int)((uint16_t)(ads_raw[1]<<8 | ads_raw[0]) >> 4);

          

          printf("%04X\n\r", data[i]);

}

        printf("\n\r");

return ret;

}

 

 

void Uart7_Task(void const * argument){ 

SPI_ADS_Init(&ads, &hspi2, GPIOB, 9);

   

  /* Infinite loop */

  for(;;)

  { 

    SPI_Read_All_Raw(&ads, ads_data);

  }

}

[/code]

 

 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 1

조회수 807

master님의 댓글

master 작성일

https://electronics.stackexchange.com/questions/616353/how-to-use-dma-to-sample-external-adc-16bit-ads8688-using-spi-with-both-single
위 사이트처럼 daisy chain 방식일까요?
저는 해당 칩의 경험이 없어서 도움을 드리지 못합니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 LED, LCD, 버튼, 부저 0922tjdus 22-11-24 940
답변 답변글 답변 : LED, LCD, 버튼, 부저 master 22-11-24 786
질문 ATmega128 온도센서 활용 관련 질문입니다. donggle 22-11-24 1377
질문 ATmega128 인터럽트를 이용한 타이머 카운터댓글[1] 코드비전 22-11-24 1018
질문 아두이노 소프트웨어 시리얼 다수 사용 질문댓글[3] s은여우s 22-11-24 888
질문 초음파센서 거리를 인식해서 카운트댓글[6] 아독 22-11-24 1506
질문 atmega128 버저 추가 초보중에최고 22-11-24 1040
질문 버튼으로 외부인터럽트 동작구현 도움이 필요해요 비비빅 22-11-23 512
답변 답변글 답변 : 버튼으로 외부인터럽트 동작구현 도움이 필요해요 master 22-11-23 707
질문 제발 도와주세요 atmega128 오류입니다댓글[1] 코드비전 22-11-23 1207
질문 컨베이어 벨트와 센서 연동 코딩 dpwl 22-11-23 816
답변 답변글 답변 : 컨베이어 벨트와 센서 연동 코딩 master 22-11-23 869
질문 Atmega128 가로등 프로그램 질문드립니다.댓글[2] 모덴 22-11-23 1191
질문 빨간불일때만 작동하게 하려는데댓글[1] daaa 22-11-23 905
질문 Atmega128댓글[1] 일렉트릭붐 22-11-22 1405
질문 atmega128과 초음파 센서 SRF02댓글[3] 마프하나 22-11-22 1172
질문 stm32 uart로 bwt61(진동센서)를 읽고 싶은데댓글[1] 라칸 22-11-22 978
질문 avr 수동부저로 도레미파솔라시 표현하기 부탁드립니다..댓글[3] cretom 22-11-22 1330
질문 아두이노 회로도 구성과 외부전원 관련댓글[1] 이미지첨부파일 덮기 22-11-22 962
질문 multiple definition of `__vector_3'댓글[1] 형니니 22-11-21 802
질문 아두이노 스피커 출력관련해서 질문드립니다댓글[1] 민석 22-11-21 1122
질문 lwip로 서버를 구현시키고 싶은데 이미지 라칸 22-11-21 772
질문 아두이노 우노 라인트레이서 질문드립니다.댓글[1] 전주사람 22-11-21 1007
질문 센서값을 배열에 넣어서 평균을 내려고 하는데 잘 안되네요... BBAM 22-11-21 657
답변 답변글 답변 : 센서값을 배열에 넣어서 평균을 내려고 하는데 잘 안되네요...댓글[1] master 22-11-21 963
질문 블루투스 통신이랑 도어락 코드를 합치고 싶습니다.댓글[1] 이재우 22-11-20 1175
질문 전화 벨소리랑 FND 코드를 합칠 수 있나요? 이제막시작 22-11-20 648
답변 답변글 답변 : 전화 벨소리랑 FND 코드를 합칠 수 있나요?댓글[4] master 22-11-20 1488
질문 RGB 코드와 소음측정 코드를 합치고 싶습니다. llllllux 22-11-20 692
답변 답변글 답변 : RGB 코드와 소음측정 코드를 합치고 싶습니다.댓글[1] master 22-11-20 844
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기