Raspberry Pi Port Expander (2 / 3 steg)
Steg 2: Sambandet mellan hård - och mjukvara
För att prata via SPI vi setup hallon för att tillåta SPI kommunikation. Det enklaste sättet att göra detta är att SPI via raspi -config.
Hur pratar vi till MCP23S17? Via SPI, men vilken dos det betyda.
SPI är en master-slave kommunikationsbuss. Innebär att bussen, vi kan ansluta så mycket enheter som vi vill ha, beroende på möjligheterna våra marker och hur mycket chipselect vår styrelse har. Med hallon som fick 2 chipselect kan vi använda 8 marker två gånger. För mer information Läs gärna denna artikel.
Allt som allt, måste vi skicka binär kod att kommunicera med våra enheter. Den första byten vi måste skicka är alltid vår enhet opcode som innehåller maskinvaruadressen för vår enhet (0b0100) samt adressen till det chip som vi vill tillgång (0b000 och 0b001) och lite SKRIVSKYDD (0b00/0b01). För att göra en byte ut det här, måste vi använda en bitvis eller operatör.
Vi kan göra detta med denna kod i javascript:
var hard_addr = 0b01000000; Vi läggs 4 nollor för att undvika en bit SKIFT
var chip_addr = 0b0010; 0b0000 vi också bifogas ett noll till undvika en bit SKIFT
var read_code = 0b01; 0b00
A = hard_addr, B = chip_addr, C = read_code
AAAABBBC
var device_opcode = hard_addr | chip_addr | read_code; 0b01000011
Den andra byte är kommandot vi vill slaven att göra och den tredje byte är det värde vi vill skriva, om vi vill skriva. Om vi vill läsa skriva vi bara 0x00 för detta ytterligare byte innebär en annan fästing och tid för slaven att köra och svara. Det finns massor av olika kommandon du kan också se i denna pdf. Eftersom chipet kan hantera in- och utdata på egen hand, tilldela vi bara alla som utdata.
För kommunikation använder jag mcp23s17 biblioteket för nodejs. Här är ett kort exempel att ansluta, läsa och skriva data:
ladda biblioteket
MCPLib = require('mcp23s17');
Skapa ny instans bredden enhet och chip_adress
behövs standardinställningarna anges (fler alternativ följer)
mcp_1 = ny MCPLib.MCP23S17 ('/ dev/spidev0.0', 0);
ansluta decive
mcp_1.connect();
var status = 0b10000000;
setInterval (function() {
om (status == 0b00000000) {
status = 0b10000000;
} annat {
status = 0b00000000;
}
mcp_1.Write 'B', status.
mcp_1.Read ("B", funktion (s) {
Console.log (s);
});
}, 500);