本文介绍了基于4412(4核,cotex-A9)和Linux,基于SPI接口控制RF无线模块,代码和分析总结如下,便于以后查阅,只要是ARM-LINUX平台都可以参考:
#include "spiRf2401.h"
int spiOpen(void)
{
int spifd=0;
spifd = open("/dev/spidev0.0", O_RDWR);
if ( spifd < 0 )
{
return -1;
}
else
{
return spifd;
}
}
int gpioOpen(void)
{
int gpiofd=0;
gpiofd = open("/dev/use_gpio_0", O_RDWR);
if ( gpiofd < 0 )
{
return -1;
}
else
{
return gpiofd;
}
}
void spiClose(int spifd)
{
close(spifd);
printf("spi closen");
}
void gpioClose(int gpiofd)
{
close(gpiofd);
printf("gpiofd closen");
}
int spiSet(int fd)
{
int ret = 0;
uChar mode=0, mode1=0;
uChar bits = 8, bits1=0;
uint32_t speed = 4000000, speed1=0; //4MHz
// spi mode
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
{
printf("can't set spi moden");
return -1;
}
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode1);
if (ret == -1)
{
printf("can't get spi moden");
//return -1;
}
// bits per word
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
{
printf("can't set bits per wordn");
return -1;
}
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits1);
if (ret == -1)
{
printf("can't get bits per wordn");
//return -1;
}
// max speed hz
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
{
printf("can't set max speed hzn");
return -1;
}
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed1);
if (ret == -1)
{
printf("can't get max speed hzn");
//return -1;
}
printf("spi mode: %dn", mode1);
printf("bits per word: %dn", bits1);
printf("max speed: %d Hz (%d KHz)n", speed1, speed1/1000);
printf("spi_set(): OK n");
return 0;
}
void nRF24L01Init(int gpiofd)
{
//CSN_1
//SCLK_0
//IRQ_1
ioctl(gpiofd, 12, 0); //spi0
//ioctl(gpiofd, 13, 0); //spi1
//printf("nRF24L01_init(): OK n");
}
int SCSPI_Write_TX_ADDR_reg(int spifd,uChar reg, uChar *pBuf, uChar len)
{
int status;
uChar i, j;
struct spi_ioc_transfer transfer_data[1];
uChar W_buf[32], R_buf[32];
if (len > ((sizeof(W_buf)) - 1))
{
len = (sizeof(W_buf)) - 1;
}
memset(transfer_data, 0, sizeof transfer_data);
memset(W_buf, 0, sizeof W_buf);
memset(R_buf, 0, sizeof R_buf);
W_buf[0] = reg;
for(i=1,j=0; j ((sizeof(W_buf)) - 1))
{
len = (sizeof(W_buf)) - 1;
}
memset(transfer_data, 0, sizeof transfer_data);
memset(W_buf, 0, sizeof W_buf);
memset(R_buf, 0, sizeof R_buf);
W_buf[0] = reg;
for(i=1; i10us
}
void RX_Mode(int gpiofd,int spifd,uChar *addr)
{
//CE_0; 进入待机Ⅰ模式
ioctl(gpiofd, XEINT12_B, LOW);
SPI_Write_Reg(spifd,WRITE_REG+CONFIG, 0x0F);
SPI_Write_Reg(spifd,FLUSH_RX, 0xff);
SPI_Write_Buf(spifd,WRITE_REG+RX_ADDR_P0, addr, RX_ADR_WIDTH);
SPI_Write_Reg(spifd,WRITE_REG+EN_AA, 0x01);
SPI_Write_Reg(spifd,WRITE_REG+EN_RXADDR, 0x01);
SPI_Write_Reg(spifd,WRITE_REG+RF_CH, 0x70);
SPI_Write_Reg(spifd,WRITE_REG+RX_PW_P0, RX_PLOAD_WIDTH);
SPI_Write_Reg(spifd,WRITE_REG+RF_SETUP, 0x0f);
SPI_Write_Reg(spifd,WRITE_REG+SETUP_AW, 0x03);
//CE_1;
ioctl(gpiofd,XEINT12_B, HIGH);//启动接收模式
//usleep(160); //>130us,from rf datasheet
}
int SPI_Write_Reg(int spifd,uChar reg,uChar value)
{
int status;
struct spi_ioc_transfer transfer_data[1];
uint8_t W_buf[2], R_buf[2];
memset(transfer_data, 0, sizeof transfer_data);
memset(W_buf, 0, sizeof W_buf);
memset(R_buf, 0, sizeof R_buf);
W_buf[0] = reg;
W_buf[1] = value;
transfer_data[0].tx_buf = (unsigned long)W_buf;
transfer_data[0].rx_buf = (unsigned long)R_buf;
transfer_data[0].len = 2;
status = ioctl(spifd, SPI_IOC_MESSAGE(1), transfer_data);
if (status < 0)
{
perror("SPI_Write_Reg():SPI_IOC_MESSAGEn");
return -1;
}
return 0;
}
int SPI_Read_Reg(int spifd,uChar reg,uChar *buf)
{
int status;
struct spi_ioc_transfer transfer_data[1];
uint8_t W_buf[2], R_buf[2];
memset(transfer_data, 0, sizeof transfer_data);
memset(W_buf, 0, sizeof W_buf);
memset(R_buf, 0, sizeof R_buf);
W_buf[0] = reg;
W_buf[1] = 0xff;
transfer_data[0].tx_buf = (unsigned long)W_buf;
transfer_data[0].rx_buf = (unsigned long)R_buf;
transfer_data[0].len = 2;
status = ioctl(spifd, SPI_IOC_MESSAGE(1), transfer_data);
if (status < 0)
{
perror("SPI_Read_Reg():SPI_IOC_MESSAGEn");
return -1;
}
memcpy(buf, R_buf, sizeof(R_buf));
return 0;
}
int SPI_Write_Buf(int spifd,uChar reg, uChar *pBuf, uChar len)
{
int status;
uChar i, j;
struct spi_ioc_transfer transfer_data[1];
uChar W_buf[32], R_buf[32];
if (len > ((sizeof(W_buf)) - 1))
{
len = (sizeof(W_buf)) - 1;
}
memset(transfer_data, 0, sizeof transfer_data);
memset(W_buf, 0, sizeof W_buf);
memset(R_buf, 0, sizeof R_buf);
W_buf[0] = reg;
for(i=1,j=0; j ((sizeof(W_buf)) - 1))
{
len = (sizeof(W_buf)) - 1;
}
memset(transfer_data, 0, sizeof transfer_data);
memset(W_buf, 0, sizeof W_buf);
memset(R_buf, 0, sizeof R_buf);
W_buf[0] = reg;
for(i=1; i
头文件:
#ifndef SPIRF2401_H
#define SPIRF2401_H
#include
#include
#include
#include
#include //memset
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SCREAD_REG 0x00
#define SCWRITE_REG 0x20
#define SCTX_ADDR 0x10
#define READ_REG 0x00
#define WRITE_REG 0x20
#define RD_RX_PLOAD 0x61
#define WR_TX_PLOAD 0xA0
#define FLUSH_TX 0xE1
#define FLUSH_RX 0xE2
#define REUSE_TX_PL 0xE3
#define NOP 0xFF
#define ConFIG 0x00
#define EN_AA 0x01
#define EN_RXADDR 0x02
#define SETUP_AW 0x03
#define SETUP_RETR 0x04
#define RF_CH 0x05
#define RF_SETUP 0x06
#define STATUS 0x07
#define OBSERVE_TX 0x08
#define CD 0x09
#define RX_ADDR_P0 0x0A
#define RX_ADDR_P1 0x0B
#define RX_ADDR_P2 0x0C
#define RX_ADDR_P3 0x0D
#define RX_ADDR_P4 0x0E
#define RX_ADDR_P5 0x0F
#define TX_ADDR 0x10
#define RX_PW_P0 0x11
#define RX_PW_P1 0x12
#define RX_PW_P2 0x13
#define RX_PW_P3 0x14
#define RX_PW_P4 0x15
#define RX_PW_P5 0x16
#define FIFO_STATUS 0x17
#define TX_ADR_WIDTH 5 //send address width
#define RX_ADR_WIDTH 5 //rcve address width
#define TX_PLOAD_WIDTH 2 //send data width
#define RX_PLOAD_WIDTH 2 //rcve data width
#define MAX_TX 0x10
#define TX_OK 0x20
#define RX_OK 0x40
//ioctl(fd,IOCTL_LED_1, LED_ON);//
#define IOCTL_LED_1 1
#define IOCTL_LED_2 2
#define IOCTL_LED_3 3
#define IOCTL_LED_4 4
#define LED_ON 0
#define LED_OFF 1
#define XEINT12_B 12
#define XEINT13_B 13
#define LOW 0
#define HIGH 1
typedef unsigned char uChar;
int spiOpen(void);
int gpioOpen(void);
void spiClose(int spifd);
void gpioClose(int gpiofd);
int spiSet(int fd);
void nRF24L01Init(int gpiofd);
int SCSPI_Write_TX_ADDR_reg(int spifd,uChar reg, uChar *pBuf, uChar len);
int SCSPI_Read_TX_ADDR_reg(int spifd,uChar reg, uChar *pBuf, uChar len);
int rfBeginTransfer(int spifd,uChar value,uChar *pBuf1);
int nRF2401SelfCheckExist(int spifd);
void TX_Mode(int gpiofd,int spifd,uChar *addr,uChar * txBuf);
void RX_Mode(int gpiofd,int spifd,uChar *addr);
int SPI_Write_Reg(int spifd,uChar reg,uChar value);
int SPI_Read_Reg(int spifd,uChar reg,uChar *buf);
int SPI_Write_Buf(int spifd,uChar reg, uChar *pBuf, uChar len);
int SPI_Read_Buf(int spifd,uChar reg, uChar *pBuf, uChar len);
int RF_Send_to_MSub(int spifd);
void RF_Revc_from_MSub(int spifd,uChar *rxBuf);
#endif



