我的cc1101怎么就是无法发送和接收数据呢?请高手指点下!
我的cc1101怎么就是无法发送和接收数据呢?请高手指点下!/*引入文件************************************************/
#include<avr/io.h>
#include <util/delay.h>
#include "cc1101.h"
/*接口定义************************************************/
#define Led 0 //输出指示
#define led_off PORTB &= ~(1<<Led) //关闭指示
#define led_onPORTB |=(1<<Led) //打开指示
/*模块接口************************************************/
#define SLK2 //时钟接口 PD2-SLK
#define CSN0 //芯片选择 PD0-CSN
#define MOSI 3 //数据输出 PD3-MOSI
#define MISO 1 //数据输入 PD1-MISO
#define GDO0 4 //状态指示 PD4-GDO0
#define SCLK_L PORTD &= ~(1<<SLK) //发出时钟 PD2
#define SCLK_H PORTD |=(1<<SLK) //结束时钟
#define MOSI_L PORTD &= ~(1<<MOSI) //低位数据 PD3
#define MOSI_H PORTD |=(1<<MOSI) //高位数据
#define MISO_L (!(MISO_H)) //输入低位 PD1
#define MISO_H (PIND &(1<<MISO)) //输入高位
#define CSN_LPORTD &= ~(1<<CSN) //使能选择 PD0
#define CSN_HPORTD |=(1<<CSN) //使能结束
#define GDO0_L (!(GDO0_H)) //低位指示 PD4
#define GDO0_H (PIND &(1<<GDO0)) //高位指示
unsigned char Patable[]={0x51, 0xC8, 0x85, 0x51, 0x3A, 0x06, 0x1C, 0x6C};//10dBm
unsigned char Tx_data[] = {0xAA}; //,0xFE, 0xD6, 0x29, 0x0E, 0x0E, 0x77, 0x88
unsigned char Rx_data;
void PORT_Init(void)
{
DDRD |= (1<<CSN|1<<SLK|1<<MOSI);//PD0,2,3输出
PORTD |= (1<<MISO|1<<GDO0); //PD1,4上拉
DDRB = 0x01;
PORTB = 0x01;
DDRA = 0xFF;
PORTA = 0xFF;
}
unsigned char SpiTxRx_Byte(unsigned char data)
{
unsigned char i, temp = 0;
for (i=0; i<8; i++) //读写八位
{
if (data & 0x80)
{
MOSI_H; //写出高位
}
else
{
MOSI_L; //写出低位
}
SCLK_H; //发出时钟
_delay_us(1);
data <<= 1; //数据左移
temp <<= 1; //数据左移
if (MISO_H)
{
temp += 1 ; //读记录高位
}
else
{
temp += 0; //读记录低位
}
SCLK_L; //结束时钟
_delay_us(1);
}
return temp; //返回数据
}
void RESET_CC1100(void)
{
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(CC_SRES); //复位命令
while (MISO_H); //等待响应
CSN_H; //结束使能
}
void POWER_UP_RESET_CC1100(void)
{
CSN_H; //上电拉高
SCLK_H, //发出时钟
MOSI_L; // *写低电平SIDLE滤波
_delay_us(1); //
CSN_L; //片选使能,低电平有效 进入SPI模式
_delay_us(1); //
CSN_H; //选择拉高SIDLE滤波
_delay_us(40); //
SCLK_L; //拉低时钟SPWD滤波
RESET_CC1100(); //复位命令
}
void Spi_Write_Strobe(unsigned char strobe)
{
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(strobe); //写入命令
CSN_H; //结束使能
}
unsigned char Spi_Read_Byte(unsigned char addr)
{
unsigned char value;
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(addr|Read_Byte); //送出地址
value = SpiTxRx_Byte(0); //读寄存器
CSN_H; //结束使能
return value; //返回数据
}
void Spi_Write_Byte(unsigned char addr,unsigned char value)
{
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(addr); //送出地址
SpiTxRx_Byte(value); //写入配置
CSN_H; //结束使能
}
void Spi_Read_Burst (unsigned char addr,unsigned char *Rx_buffer,unsigned char count)
{
unsigned char i;
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte((addr|Read_Burst)); //连续读取
for (i = 0; i < count; i++) //
{
Rx_buffer = SpiTxRx_Byte(0); //存储数据
}
CSN_H; //结束使能
}
void Spi_Write_Burst(unsigned char addr,unsigned char *Tx_buffer,unsigned char count)
{
unsigned char i;
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte((addr|Write_Burst)); //连续写入
for (i = 0; i < count; i++) //
{
SpiTxRx_Byte(Tx_buffer); //送出数据
}
CSN_H; //结束使能
}
unsigned char Spi_Read_Packet(unsigned char *Rx_buffer,unsigned char length)
{
unsigned char status;
unsigned char size = 0;
Spi_Write_Strobe(CC_SRX);
size = Spi_Read_Byte(CC_RXFIFO); //数据长度
if (size < length) //*接收的数据长度是否小于存放数组的长度*//
{
Spi_Read_Burst(CC_RXFIFO,Rx_buffer,size); //接收数据
Spi_Read_Burst(CC_RXFIFO,status,2); //校验数据
}
Spi_Write_Strobe(CC_SFRX); //清缓冲区
return (status & CRC_OK); //校验标志
}
void Spi_Write_Packet(unsigned char *Tx_buffer,unsigned char size)
{
unsigned char i;
Spi_Write_Byte(CC_TXFIFO,size); //先送长度
Spi_Write_Burst(CC_TXFIFO,Tx_buffer,size);//发送数据
Spi_Write_Strobe(CC_STX); //发送模式
i = 0;
while (GDO0_L) //等待送出
{
if (i > 10) break; //限时等待
_delay_us(1); //
i++; //
}
i = 0;
while (GDO0_H) //送出完毕
{
if (i > 10) break; //限时等待
_delay_us(1); //
i++; //
}
Spi_Write_Strobe(CC_SFTX); //清缓冲区
//Spi_Write_Strobe(CC_SIDLE); //进入空闲
//Spi_Write_Strobe(CC_SRX); //进入接收
}
void Rx_cc1100(void)
{
//unsigned char *buffer = Rx_data;
unsigned char size;
size = sizeof(Rx_data); //最大长度
Spi_Read_Packet(Rx_data,size);//读取数据包
Spi_Write_Strobe(CC_SIDLE); //进入空闲
//Spi_Write_Strobe(CC_SRX); //进入接收
}
void Tx_cc1100(void)
{
unsigned char Tx_Size;
Tx_Size = sizeof(Tx_data); //数组长度
Spi_Write_Packet(Tx_data,Tx_Size); //发送数据包
Spi_Write_Strobe(CC_SIDLE); //进入空闲
Spi_Write_Strobe(CC_SRX); //进入接收
}
void WriteRfSettings(void)
{
Spi_Write_Byte (CC_IOCFG2,IOCFG2); //
Spi_Write_Byte (CC_IOCFG0,IOCFG0); //
Spi_Write_Byte (CC_FIFOTHR,FIFOTHR); //
Spi_Write_Byte (CC_PKTLEN,PKTLEN); //
Spi_Write_Byte (CC_PKTCTRL1,PKTCTRL1); //
Spi_Write_Byte (CC_PKTCTRL0,PKTCTRL0); //
Spi_Write_Byte (CC_ADDR,ADDR); //
Spi_Write_Byte (CC_CHANNR,CHANNR); //
Spi_Write_Byte (CC_FSCTRL1,FSCTRL1); //
Spi_Write_Byte (CC_FSCTRL0,FSCTRL0); //
Spi_Write_Byte (CC_FREQ2,FREQ2); //
Spi_Write_Byte (CC_FREQ1,FREQ1); //
Spi_Write_Byte (CC_FREQ0,FREQ0); //
Spi_Write_Byte (CC_MDMCFG4,MDMCFG4); //
Spi_Write_Byte (CC_MDMCFG3,MDMCFG3); //
Spi_Write_Byte (CC_MDMCFG2,MDMCFG2); //
Spi_Write_Byte (CC_MDMCFG1,MDMCFG1); //
Spi_Write_Byte (CC_MDMCFG0,MDMCFG0); //
Spi_Write_Byte (CC_DEVIATN,DEVIATN); //
Spi_Write_Byte (CC_MCSM0,MCSM0); //
Spi_Write_Byte (CC_FOCCFG,FOCCFG); //
Spi_Write_Byte (CC_BSCFG,BSCFG); //
Spi_Write_Byte (CC_AGCCTRL2,AGCCTRL2); //
Spi_Write_Byte (CC_AGCCTRL1,AGCCTRL1); //
Spi_Write_Byte (CC_AGCCTRL0,AGCCTRL0); //
Spi_Write_Byte (CC_FREND1,FREND1); //
Spi_Write_Byte (CC_FREND0,FREND0); //
Spi_Write_Byte (CC_FSCAL3,FSCAL3); //
Spi_Write_Byte (CC_FSCAL2,FSCAL2); //
Spi_Write_Byte (CC_FSCAL1,FSCAL1); //
Spi_Write_Byte (CC_FSCAL0,FSCAL0); //
Spi_Write_Byte (CC_FSTEST,FSTEST); //
Spi_Write_Byte (CC_TEST2,TEST2); //
Spi_Write_Byte (CC_TEST1,TEST1); //
Spi_Write_Byte (CC_TEST0,TEST0); //
}
void Init_cc1100(void)
{
POWER_UP_RESET_CC1100(); //上电复位
WriteRfSettings(); //写入配置
Spi_Write_Burst(CC_PATABLE,Patable,8); //功率配置
Spi_Write_Strobe(CC_SIDLE); //进入空闲
Spi_Write_Strobe(CC_SRX); //进入接收 */
}
void _delay_s(unsigned char t)
{
unsigned char i,j;
for(j=0;j<t;j++);
{
for(i=0;i<16;i++)
_delay_ms(65);
}
}
int main(void)
{
unsigned char i;
PORT_Init(); //IO定义
_delay_s(2);
led_off;
_delay_s(2);
Init_cc1100();
while(1)
{
Rx_cc1100();
led_on;
for(i=0;i<10;i++)
{
PORTA = Rx_data;
_delay_s(3);
}
Rx_cc1100();
}
}
/*********************************************************/
页:
[1]