Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15870] 라즈베리파이에서 CAN 드라이버 MCP25625 사용하기
민트blue [] 255 읽음    2017-03-23 20:03
안녕하세요, 질문이 있어서 글 올립니다.

이번에 라즈베리파이에서 MCP25625를 이용하여 CAN 통신을 해보려고 합니다.
device open은 된거 같은데, MCP25625의 레지스터 값을 읽지 못하고 있습니다.
어디서부터 잘못된 건지 감이 안잡혀서 도움을 구합니다.  많은 조언 부탁드립니다.

PS) 아래의 소스에 있는 BCM2710SPI0WriteRead 함수로 XRA1405(SPI interface I/O expander)가 정상동작하는것은 확인했습니다.
       while문 안의 변수 SourceBuff에 write할 Register Address와 data(혹은 Address만)를 입력하면 됩니다.
       MCP25625에서 CS,CLK,MOSI.MISO 외에는 reset 핀만 라즈베리파이와 연결되어있습니다.

개발환경 - 1) OS : OS 대신 Ultibo Core 사용
                2) 컴파일러 : Lazarus (ultibo edition)
                3) 언어 : objfpc

----------------------------------------
[소스]
program SPI_0;
{$mode objfpc}{$H+}
uses
  RaspberryPi3,
  Devices,
  GlobalConfig,
  GlobalConst,
  GlobalTypes,
  Platform,
  Threads,
  Console,
  Framebuffer,
  BCM2837,
  BCM2710,
  SysUtils,
  Serial,
  SPI,Gpio, Wiring,
  RGPIO, PReg;// RGPIO, PReg는 GPIO 관련 unit
  { Add additional units here }
var
 Count:LongWord;
 Characters, ReadData:String;
 Source,Dest:Pointer;
 SourceBuff,DestBuff:LongWord;
 SPIDevice:PSPIDevice;
begin
  GPIO_OUT_Init(GPIO19); //GPIO19 Output 설정
  GPIO19_Set; // GPIO19 High
  Source:=@SourceBuff;
  Dest:=@DestBuff;

  SerialOpen(115200,SERIAL_DATA_8BIT,SERIAL_STOP_1BIT,SERIAL_PARITY_NONE,SERIAL_FLOW_NONE,0,0); //UART 설정
  Count:=0;
  Characters:='SPI START'+#13#10;
  SerialWrite(PChar(Characters),Length(Characters),Count); //'SPI START' UART 출력
  SPIDevice:=PSPIDevice(DeviceFindByDescription('BCM2837 SPI0 Master')); // SPI Device find
  { MCP25625 Setting }
  SPIInit;
  if BCM2710SPI0Start(SPIDevice, SPI_MODE_4WIRE, 10000000,
                    SPI_CLOCK_PHASE_LOW, SPI_CLOCK_POLARITY_LOW) = ERROR_SUCCESS then begin
  end;
  {MCP25625 Reset}
  GPIO19_Clear;
  delayMicroseconds(5);
  GPIO19_Set;
 
  SourceBuff:=$050FC700; //Normal mode(write)
  if BCM2710SPI0WriteRead(SPIDevice, SPI_CS_0, Source, Dest, 4, SPI_TRANSFER_NONE, Count) = ERROR_SUCCESS then begin
  end;
 
  while True do
  begin
 
      SourceBuff:=$A0; //Read Status Register
      if BCM2710SPI0WriteRead(SPIDevice, SPI_CS_0, Source, Dest, 2, SPI_TRANSFER_NONE, Count) = ERROR_SUCCESS then begin
      end;
      ReadData:=IntToStr(DestBuff)+#13#10;
      SerialWrite(PChar(ReadData),Length(ReadData),Count);

      SourceBuff:=$B0; //Read RX Status Register
      if BCM2710SPI0WriteRead(SPIDevice, SPI_CS_0, Source, Dest, 2, SPI_TRANSFER_NONE, Count) = ERROR_SUCCESS then begin
      end;
      ReadData:=IntToStr(DestBuff)+#13#10;
      SerialWrite(PChar(ReadData),Length(ReadData),Count);
     
  end;
end.
-----------------------------------------------------

감사합니다.

+ -

관련 글 리스트
15870 라즈베리파이에서 CAN 드라이버 MCP25625 사용하기 민트blue 255 2017-03-23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.