Skip to content

Instantly share code, notes, and snippets.

@sp5wwp
Created April 15, 2024 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sp5wwp/25fa989ebd98b3b707eadae9b63af679 to your computer and use it in GitHub Desktop.
Save sp5wwp/25fa989ebd98b3b707eadae9b63af679 to your computer and use it in GitHub Desktop.
SX1255 sample config using a RPi
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <math.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#define CLK_FREQ (32.0e6f)
const char *device="/dev/spidev0.0";
uint8_t mode;
uint8_t bits=8;
uint32_t speed=500000;
void gpio_init(void)
{
FILE* fp;
char tmp[256];
//enable
fp=fopen("/sys/class/gpio/export", "wb");
if(fp!=NULL)
{
sprintf(tmp, "%d", 537); //RST pin is hardcoded at GPIO_25
fwrite(tmp, strlen(tmp), 1, fp);
fclose(fp);
}
else
{
printf("Can not initialize RST pin\nExiting\n");
exit(1);
}
usleep(250000U); //give it 250ms
sprintf(tmp, "/sys/class/gpio/gpio%d/direction", 537);
fp=fopen(tmp, "wb");
if(fp!=NULL)
{
fwrite("out", 3, 1, fp);
fclose(fp);
}
else
{
printf("Can not initialize RST pin\nExiting\n");
exit(1);
}
}
int rst(uint8_t state)
{
FILE* fp=NULL;
char tmp[256];
sprintf(tmp, "/sys/class/gpio/gpio%d/value", 537);
fp=fopen(tmp, "wb");
if(fp!=NULL)
{
if(state)
{
fwrite("1", 1, 1, fp);
}
else
{
fwrite("0", 1, 1, fp);
}
fclose(fp);
return 0;
}
else
{
printf("Error - can not set GPIO%d value\n", 537);
return 1;
}
}
int spi_init(char *dev)
{
int fd;
int ret;
fd = open(dev, O_RDWR);
if(fd<0)
{
printf("Can't open SPI device\n");
return fd;
}
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if(ret == -1)
{
printf("Can't open SPI device\n");
return -1;
}
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if(ret == -1)
{
printf("Can't open SPI device\n");
return -1;
}
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if(ret == -1)
{
printf("Can't set SPI device\n");
return -1;
}
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if(ret == -1)
{
printf("Can't set SPI device\n");
return -1;
}
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if(ret == -1)
{
printf("Can't set SPI device\n");
return -1;
}
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if(ret == -1)
{
printf("Can't set SPI device\n");
return -1;
}
close(fd);
return 0;
}
void sx1255_writereg(uint8_t addr, uint8_t val)
{
int fd;
//int ret;
fd = open(device, O_RDWR);
uint8_t tx[2] = {addr|(1<<7), val};
uint8_t rx[2] = {0, 0};
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = 2,
.delay_usecs = 0,
.speed_hz = speed,
.bits_per_word = bits
};
/*ret = */ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
close(fd);
usleep(10000U);
}
uint8_t sx1255_readreg(uint8_t addr)
{
int fd;
//int ret;
fd = open(device, O_RDWR);
uint8_t tx[2] = {addr, 0};
uint8_t rx[2] = {0, 0};
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = 2,
.delay_usecs = 0,
.speed_hz = speed,
.bits_per_word = bits
};
/*ret = */ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
close(fd);
return rx[1];
usleep(10000U);
}
uint8_t sx1255_set_rx_freq(uint32_t freq)
{
if(freq<=510e6 && freq>=410e6)
{
uint32_t val=lround((float)freq*1048576.0f/CLK_FREQ); //1048576 = 2^20
sx1255_writereg(0x01, (val>>16)&0xFF); //MSB first
sx1255_writereg(0x02, (val>>8)&0xFF);
sx1255_writereg(0x03, val&0xFF); //LSB
return 0;
}
else
return 1;
}
uint8_t sx1255_set_tx_freq(uint32_t freq)
{
if(freq<=510e6 && freq>=410e6)
{
uint32_t val=lround((float)freq*1048576.0f/CLK_FREQ); //1048576 = 2^20
sx1255_writereg(0x04, (val>>16)&0xFF); //MSB first
sx1255_writereg(0x05, (val>>8)&0xFF);
sx1255_writereg(0x06, val&0xFF); //LSB
return 0;
}
else
return 1;
}
int main(void)
{
if(spi_init((char*)device)==0)
printf("SPI config OK\n");
else
return -1;
gpio_init();
usleep(100000U); //give it 100ms
rst(1);
usleep(100000U); //give it 100ms
rst(0);
usleep(100000U); //give it 100ms
uint8_t vals[5];
//read reg 0x07
vals[0]=sx1255_readreg(0x07);
//bitrate setting: 8*3^0*2^5=256, I2S left aligned
sx1255_writereg(0x13, (0<<7)|(0<<6)|(5<<3)|(1<<2));
//mode B2, div=2^2=4
sx1255_writereg(0x12, (2<<4)|2);
//set RX freq to 435 MHz
sx1255_set_rx_freq(435e6);
//set TX freq to 438 MHz
sx1255_set_tx_freq(438e6);
//reg 0x0D - bandwidth
sx1255_writereg(0x0D, (0x01<<5)|(0x05<<2)|0x03);
//PLL BW to lowest setting
sx1255_writereg(0x0E, 0x00);
//RX gain
sx1255_writereg(0x0C, (0x01<<5)|(0x0F<<1)|0x01); //1..6, 0..F
//enable rx and tx
sx1255_writereg(0x00, (1<<3)|(1<<2)|(1<<1)|1);
//read reg 0x11 and 0x13
vals[1]=sx1255_readreg(0x11);
vals[2]=sx1255_readreg(0x13);
printf("07=%02X 11=%02X 13=%02X\n", vals[0], vals[1], vals[2]);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment