Now transferring buffers with SPI instead of single-byte operations.
This commit is contained in:
parent
da68f8111d
commit
514e81c3c1
16
lmic/hal.h
16
lmic/hal.h
@ -53,7 +53,21 @@ void hal_pin_rst (u1_t val);
|
|||||||
* - write given byte 'outval'
|
* - write given byte 'outval'
|
||||||
* - read byte and return value
|
* - read byte and return value
|
||||||
*/
|
*/
|
||||||
u1_t hal_spi (u1_t outval);
|
// u1_t hal_spi (u1_t outval);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 2017-04-19 Wolfgang Klenk
|
||||||
|
* Perform Read/Write operations with 8-bit address and 8-bit data
|
||||||
|
*/
|
||||||
|
u1_t hal_spi_single(u1_t address, u1_t outval);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 2017-04-19 Wolfgang Klenk
|
||||||
|
* Perform Read/Write operations with 8-bit address and buffer
|
||||||
|
*/
|
||||||
|
void hal_spi_buffer(u1_t address, u1_t *buffer, int len);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* disable all CPU interrupts.
|
* disable all CPU interrupts.
|
||||||
|
16
lmic/radio.c
16
lmic/radio.c
@ -278,34 +278,26 @@ static u1_t randbuf[16];
|
|||||||
|
|
||||||
static void writeReg (u1_t addr, u1_t data ) {
|
static void writeReg (u1_t addr, u1_t data ) {
|
||||||
hal_pin_nss(0);
|
hal_pin_nss(0);
|
||||||
hal_spi(addr | 0x80);
|
hal_spi_single(addr | 0x80, data);
|
||||||
hal_spi(data);
|
|
||||||
hal_pin_nss(1);
|
hal_pin_nss(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u1_t readReg (u1_t addr) {
|
static u1_t readReg (u1_t addr) {
|
||||||
hal_pin_nss(0);
|
hal_pin_nss(0);
|
||||||
hal_spi(addr & 0x7F);
|
u1_t val = hal_spi_single(addr & 0x7F, 0x00);
|
||||||
u1_t val = hal_spi(0x00);
|
|
||||||
hal_pin_nss(1);
|
hal_pin_nss(1);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeBuf (u1_t addr, xref2u1_t buf, u1_t len) {
|
static void writeBuf (u1_t addr, xref2u1_t buf, u1_t len) {
|
||||||
hal_pin_nss(0);
|
hal_pin_nss(0);
|
||||||
hal_spi(addr | 0x80);
|
hal_spi_buffer(addr | 0x80, buf, len);
|
||||||
for (u1_t i=0; i<len; i++) {
|
|
||||||
hal_spi(buf[i]);
|
|
||||||
}
|
|
||||||
hal_pin_nss(1);
|
hal_pin_nss(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readBuf (u1_t addr, xref2u1_t buf, u1_t len) {
|
static void readBuf (u1_t addr, xref2u1_t buf, u1_t len) {
|
||||||
hal_pin_nss(0);
|
hal_pin_nss(0);
|
||||||
hal_spi(addr & 0x7F);
|
hal_spi_buffer(addr & 0x7F, buf, len);
|
||||||
for (u1_t i=0; i<len; i++) {
|
|
||||||
buf[i] = hal_spi(0x00);
|
|
||||||
}
|
|
||||||
hal_pin_nss(1);
|
hal_pin_nss(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,8 +101,7 @@ void hal_init () {
|
|||||||
// Make sure that SPI communication with the radio module works
|
// Make sure that SPI communication with the radio module works
|
||||||
// by reading the "version" register 0x42 of the radio module.
|
// by reading the "version" register 0x42 of the radio module.
|
||||||
hal_pin_nss(0);
|
hal_pin_nss(0);
|
||||||
hal_spi(0x42 & 0x7F);
|
u1_t val = hal_spi_single(0x42 & 0x7F, 0x00);
|
||||||
u1_t val = hal_spi(0x00);
|
|
||||||
hal_pin_nss(1);
|
hal_pin_nss(1);
|
||||||
|
|
||||||
if (0 == val) {
|
if (0 == val) {
|
||||||
@ -144,7 +143,7 @@ void hal_pin_nss (u1_t val) {
|
|||||||
// switch between radio RX/TX
|
// switch between radio RX/TX
|
||||||
void hal_pin_rxtx (u1_t val) {
|
void hal_pin_rxtx (u1_t val) {
|
||||||
#ifdef DEBUG_HAL
|
#ifdef DEBUG_HAL
|
||||||
val > 0 ? fprintf(stdout, "%09d HAL: Sending ...\n", osticks2ms(hal_ticks()), val) : fprintf(stdout, "%09d HAL: Receiving ...\n", osticks2ms(hal_ticks()), val);
|
val > 0 ? fprintf(stdout, "%09d HAL: Sending ...\n", osticks2ms(hal_ticks())) : fprintf(stdout, "%09d HAL: Receiving ...\n", osticks2ms(hal_ticks()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Nothing to do. There is no such pin in the Lora/GPS HAT module.
|
// Nothing to do. There is no such pin in the Lora/GPS HAT module.
|
||||||
@ -167,13 +166,6 @@ void hal_pin_rst (u1_t val) {
|
|||||||
// perform 8-bit SPI transaction.
|
// perform 8-bit SPI transaction.
|
||||||
// write given byte outval to radio, read byte from radio and return value.
|
// write given byte outval to radio, read byte from radio and return value.
|
||||||
u1_t hal_spi (u1_t out) {
|
u1_t hal_spi (u1_t out) {
|
||||||
static u1_t isAddress = 0x01;
|
|
||||||
static u1_t address = 0x00;
|
|
||||||
u1_t value = out;
|
|
||||||
|
|
||||||
if (isAddress) {
|
|
||||||
address = out;
|
|
||||||
}
|
|
||||||
|
|
||||||
u1_t rc = wiringPiSPIDataRW(0, &out, 1);
|
u1_t rc = wiringPiSPIDataRW(0, &out, 1);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
@ -181,22 +173,41 @@ u1_t hal_spi (u1_t out) {
|
|||||||
hal_failed();
|
hal_failed();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (!isAddress && (address != 0x2c)) {
|
|
||||||
if (address & 0x80) {
|
|
||||||
fprintf(stdout, "%09d HAL: SPI write to address 0x%02x value 0x%02x\n", osticks2ms(hal_ticks()), address & 0x7F, value);
|
|
||||||
fprintf(stdout, " writeReg(0x%02x, 0x%02x);\n", address & 0x7F, value);
|
|
||||||
} else {
|
|
||||||
fprintf(stdout, "%09d HAL: SPI read from address 0x%02x value 0x%02x\n", osticks2ms(hal_ticks()), address, out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
isAddress = !isAddress;
|
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SPI transfer with address and one single byte.
|
||||||
|
u1_t hal_spi_single (u1_t address, u1_t out) {
|
||||||
|
|
||||||
|
u1_t buffer[2];
|
||||||
|
buffer[0] = address;
|
||||||
|
buffer[1] = out;
|
||||||
|
|
||||||
|
u1_t rc = wiringPiSPIDataRW(0, buffer, 2);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "HAL: Cannot send data on SPI: %s\n", strerror(errno));
|
||||||
|
hal_failed();
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// SPI transfer with address and byte buffer.
|
||||||
|
void hal_spi_buffer (u1_t address, u1_t *buffer, int len) {
|
||||||
|
|
||||||
|
u1_t buf[len + 1];
|
||||||
|
buf[0] = address;
|
||||||
|
memcpy(&buf[1], buffer, len);
|
||||||
|
|
||||||
|
u1_t rc = wiringPiSPIDataRW(0, buf, len + 1);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "HAL: Cannot send data on SPI: %s\n", strerror(errno));
|
||||||
|
hal_failed();
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buffer, &buf[1], len);
|
||||||
|
}
|
||||||
|
|
||||||
void hal_disableIRQs () {
|
void hal_disableIRQs () {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user