|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2008-6-16 17:56:22
|
显示全部楼层
/*引入文件************************************************/
#include<iom8V.h>
#include<macros.h>
#include "CC1100.h"
/*接口定义************************************************/
#define key 0 //按键输入
#define spz 6 //喇叭输出
#define Led1 1 //输出指示
#define Led2 2 //输出指示
#define key_L (!(key_H)) //按键触发
#define key_H (PINB &= (1<<key)) //按键弹起
#define led1_Off PORTB &= ~(1<<Led1) //关闭指示
#define led1_On PORTB |= (1<<Led1) //打开指示
#define led2_Off PORTB &= ~(1<<Led2) //关闭指示
#define led2_On PORTB |= (1<<Led2) //打开指示
#define spz_H PORTD |= (1<<spz) //蜂鸣器响
#define spz_L PORTD &= ~(1<<spz) //蜂鸣器关
/*模块接口************************************************/
#define SLK 0 //时钟接口
#define CSN 1 //芯片选择
#define MOSI 2 //数据输出
#define MISO 3 //数据输入
#define GDO0 4 //状态指示
#define GDO2 5 //状态指示
#define SCLK_L PORTD &= ~(1<<SLK) //发出时钟
#define SCLK_H PORTD |= (1<<SLK) //结束时钟
#define CSN_L PORTD &= ~(1<<CSN) //使能选择
#define CSN_H PORTD |= (1<<CSN) //使能结束
#define MOSI_L PORTD &= ~(1<<MOSI) //低位数据
#define MOSI_H PORTD |= (1<<MOSI) //高位数据
#define MISO_L (!(MISO_H)) //输入低位
#define MISO_H (PIND &= (1<<MISO)) //输入高位
#define GDO0_L (!(GDO0_H)) //低位指示
#define GDO0_H (PIND &= (1<<GDO0)) //高位指示
#define GDO2_L (!(GDO2_H)) //低位指示
#define GDO2_H (PIND &= (1<<GDO2)) //高位指示
/*发送数据************************************************/
unsigned char Tx_data[] =
{0x01 ,0xFE, 0xD6, 0x29, 0x0E, 0x0E, 0x77, 0x88};
/*接收数据************************************************/
unsigned char Rx_data[10];
/*功率配置************************************************/
unsigned char PaTabel[] =
{0xC0, 0xC8, 0x85, 0x51, 0x3A, 0x06, 0x1C, 0x6C};
/*********************************************************/
/*函数名字:delay_ns */
/*输入参数:延时周期参数 */
/*输出参数:无 */
/*功能描述:延时1 纳秒 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void delay_ns(unsigned char n) //纳秒延时
{
while (n--);
}
/*********************************************************/
/*函数名字:delay_ms */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:延时1 毫秒 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void delay_ms(void) //毫秒延时
{
unsigned int i;
for (i=0; i<1500; i++)
{
NOP();
}
}
/*********************************************************/
/*函数名字:delay_nms */
/*输入参数:延时周期参数据 */
/*输出参数:无 */
/*功能描述:延时程序 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void delay_nms(unsigned int n) //延时周期
{
unsigned int i;
for (i=0; i<n; i++)
{
delay_ms();
}
}
/*********************************************************/
/*函数名字:Spz_dealy */
/*输入参数:鸣响延时周期 */
/*输出参数:无 */
/*功能描述:蜂鸣器鸣叫 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void Spz_delay(unsigned char n)
{
unsigned char i;
spz_H; //蜂鸣器响
for (i=0; i<n; i++) //延时周期
{
delay_ms();
}
spz_L; //蜂鸣器关
}
/*********************************************************/
/*函数名字:PORT_Init */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:单片机端口初始化 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void PORT_Init(void)
{
DDRD =0B11000111; //模块接脚
PORTD=0B10111111; //
DDRB =0B11111110; //按键输入
PORTB=0B11111001; //
}
/*********************************************************/
/*函数名字:Led_Light */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:LED1闪烁三次 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void Led_Light(void)
{
unsigned char i;
for (i=0;i<3;i++) //闪烁三次
{
led1_On; //输出指示
delay_nms(50); //
led1_Off; //关闭指示
delay_nms(50); //
}
}
/*********************************************************/
/*函数名字:SpiTxRx_Byte */
/*输入参数:写入寄存器的数据 */
/*输出参数:读取寄存器的数据 */
/*功能描述:通过SPI 串口读写一字节数据 */
/*建造日期;2008年03月30日 */
/*********************************************************/
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; //发出时钟
NOP();
NOP();
data <<= 1;
temp <<= 1; //数据左移
if (MISO_H)
{
temp += 1 ; //记录高位
}
else
{
temp += 0; //记录低位
}
SCLK_L; //结束时钟
NOP();
NOP();
}
return temp; //返回数据
}
/*********************************************************/
/*函数名字:RESET_CC1100 */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:写入复位滤波命 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void RESET_CC1100(void)
{
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(CC_SRES); //复位命令
while (MISO_H); //等待响应
CSN_H; //结束使能
}
/*********************************************************/
/*函数名字:POWER_UP_RESET_CC1100 */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:模块上电初始化 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void POWER_UP_RESET_CC1100(void)
{
CSN_H; //上电拉高
SCLK_H,MOSI_L; //
delay_ns(1); //
CSN_L; //片选使能
delay_ns(1); //
CSN_H; //选择拉高
delay_ns(80); //
SCLK_L; //拉低时钟
RESET_CC1100(); //复位命令
}
/*********************************************************/
/*函数名字:Init_cc1100 */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:初始化模块 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void Init_cc1100(void)
{
POWER_UP_RESET_CC1100(); //上电复位
WriteRfSettings(); //写入配置
Spi_Write_Burst(CC_PATABLE,PaTabel,8); //功率配置
Spi_Write_Strobe(CC_SIDLE); //进入空闲
Spi_Write_Strobe(CC_SRX); //进入接收
}
/*********************************************************/
/*函数名字:Spi_Write_Strobe */
/*输入参数:滤波命令 */
/*输出参数:无 */
/*功能描述:写入滤波命令 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void Spi_Write_Strobe(unsigned char strobe)
{
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(strobe); //写入命令
CSN_H; //结束使能
}
/*********************************************************/
/*函数名字:Spi_Read_Byte */
/*输入参数:寄存器地址 */
/*输出参数:寄存器配置 */
/*功能描述:单字节读取寄存器 */
/*建造日期;2008年03月30日 */
/*********************************************************/
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; //返回数据
}
/**********************************************************/
/*函数名字:Spi_Write_Byte */
/*输入参数:寄存器地址,配置 */
/*输出参数:无 */
/*功能描述:单字节写入寄存器 */
/*建造日期;2008年03月30日 */
/**********************************************************/
void Spi_Write_Byte(unsigned char addr,unsigned char value)
{
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte(addr); //送出地址
SpiTxRx_Byte(value); //写入配置
CSN_H; //结束使能
}
/**********************************************************/
/*函数名字:Spi_Read_Burst */
/*输入参数:寄存器地址,接收缓冲区首址,接收字节数 */
/*输出参数:结果存储在缓冲区地址 */
/*功能描述:连续读取寄存器数据 */
/*建造日期;2008年03月30日 */
/**********************************************************/
void Spi_Read_Burst (unsigned char addr,unsigned char *buffer,unsigned char count)
{
unsigned char i;
CSN_L; //片选使能
while (MISO_H); //等待响应
SpiTxRx_Byte((addr|Read_Burst)); //连续读取
for (i = 0; i < count; i++) //
{
buffer = SpiTxRx_Byte(0); //存储数据
}
CSN_H; //结束使能
}
/**********************************************************/
/*函数名字:Spi_Write_Burst */
/*输入参数:寄存器地址,发射缓冲区首址,发送字节数 */
/*输出参数:无 */
/*功能描述:连续写入寄存器数据 */
/*建造日期;2008年03月30日 */
/**********************************************************/
void Spi_Write_Burst(unsigned char addr,unsigned char *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(buffer); //送出数据
}
CSN_H; //结束使能
}
/*********************************************************/
/*函数名字:Spi_Write_Packet */
/*输入参数:发送缓冲区首址,数组长度 */
/*输出参数:无 */
/*功能描述:发送缓冲区数据 */
/*建造日期;2008年03月30日 */
/*********************************************************/
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_nms(1); //
i++; //
}
i = 0;
while (GDO0_H) //送出完毕
{
if (i > 10) break; //限时等待
delay_nms(1); //
i++; //
}
delay_nms(1);
Spi_Write_Strobe(CC_SFTX); //清缓冲区
Spi_Write_Strobe(CC_SIDLE); //进入空闲
Spi_Write_Strobe(CC_SRX); //进入接收
}
/*********************************************************/
/*函数名字:Spi_Read_Packet */
/*输入参数:接收缓冲区首址,最大长度 */
/*输出参数:校验标志 */
/*功能描述:数据存入缓冲区 */
/*建造日期;2008年03月30日 */
/*********************************************************/
unsigned char Spi_Read_Packet(unsigned char *Rx_buffer,unsigned char length)
{
unsigned char status[2];
unsigned char size = 0;
delay_nms(1);
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[1] & CRC_OK); //校验标志
}
/*********************************************************/
/*函数名字:WriteRfSettings */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:模块寄存器配置 */
/*建造日期;2008年03月30日 */
/*********************************************************/
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); //
}
/*********************************************************/
/*函数名字:RX_ACK */
/*输入参数:无 */
/*输出参数:应答标志 */
/*功能描述:等待从机应答,返回应答标志 */
/*建造日期;2008年03月30日 */
/*********************************************************/
unsigned char RX_ACK(void)
{
unsigned char *buffer = Rx_data;
unsigned int size,i=0;
size = sizeof(Rx_data); //最大长度
while (i <10000) //限时应答
{
delay_ns(15);
i++;
if (GDO0_H) //等待应答
{
if (Spi_Read_Packet(Rx_data,size)) //应答出现
{
if (!(buffer[0] ^= buffer[1])) //
{
if ((buffer[2] == (~(buffer[3])))) //
{
return 1; //成功应答
}
}
}
}
}
return 0; //没有应答
}
/*********************************************************/
/*函数名字:TX_ACK */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:接收成功发送应答 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void TX_ACK(void)
{
unsigned char PA;
PA = Rx_data[4]; //获取功率
Spz_delay(50); //成功接收
Spi_Write_Byte (CC_FREND0,PA); //功率配置
Spi_Write_Packet(Tx_data,4); //发送应答
}
/*********************************************************/
/*函数名字:Tx_cc1100 */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:发送数据,应答失败从发 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void Tx_cc1100(void)
{
unsigned char PA,i;
unsigned char ACK,Tx_Size;
Tx_Size = sizeof(Tx_data); //数组长度
Tx_data[4] = PA = 0x10; //最大功率
for (i=0; i<2; i++)
{
Spi_Write_Byte (CC_FREND0,PA); //功率配置
Spi_Write_Packet(Tx_data,Tx_Size); //开始发送
ACK = RX_ACK();
if (ACK) //是否应答
{
Led_Light(); //对方应答
break; //应答退出
}
Tx_data[4] = PA = 0x17; //降低功率
}
delay_nms(1);
Spi_Write_Strobe(CC_SIDLE); //进入空闲
Spi_Write_Strobe(CC_SRX); //进入接收
}
/*********************************************************/
/*函数名字:Rx_cc1100 */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:接收数据,成功发送应答 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void Rx_cc1100(void)
{
unsigned char *buffer = Rx_data;
unsigned char i, size;
for (i = 0; i < 15; i++)
{
buffer = 0;
}
size = sizeof(Rx_data); //最大长度
if (Spi_Read_Packet(Rx_data,size)) //接收数据
{
if (!(buffer[0] ^= buffer[1])) //
{
if ((buffer[2] == (~(buffer[3])))) //
{
TX_ACK(); //发送应答
}
}
}
delay_nms(1);
Spi_Write_Strobe(CC_SIDLE); //进入空闲
Spi_Write_Strobe(CC_SRX); //进入接收
}
/*********************************************************/
/*函数名字:nain */
/*输入参数:无 */
/*输出参数:无 */
/*功能描述:主程序 */
/*建造日期;2008年03月30日 */
/*********************************************************/
void main(void)
{
PORT_Init(); //脚位定义
Led_Light(); //输出指示
Init_cc1100(); //模块设置
while(1) //循环程序
{
if (key_L) //按键检测
{
delay_nms(20); //防误处理
if (key_L) //
{
led2_On; //打开指示
Tx_cc1100(); //发送数据
while(key_L); //等待弹起
led2_Off; //关闭指示
}
}
if (GDO0_H) Rx_cc1100(); //接收数据
}
}
/*********************************************************/ |
|