栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

基于Linux和4412处理器实现SPI接口的RF控制

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于Linux和4412处理器实现SPI接口的RF控制

         本文介绍了基于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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/300383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号