안녕하세요, 질문이 있어서 글 올립니다.
이번에 라즈베리파이에서 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.
-----------------------------------------------------
감사합니다.
|