?? main.c
字號:
#include <reg931.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FALSE 0
//-------------------------------------------------------------------------------------------------------
typedef unsigned char BOOL;
// Data
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
/*******************************************************************************************/
/*//////////////////// LCD12864 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*\
/********************************************************************************************/
//LCD 引腳定義
sbit SCLK = P0^1;
sbit SID = P2^0;
sbit A0 = P0^0;
sbit CS1 = P1^7;
sbit RES = P2^1;
uchar code ComTable[]={3,2,1,0,7,6,5,4,};
#define DISPLAY_ON() Write_Instruction(0xaf) // Display on
#define DISPLAY_OFF() Write_Instruction(0xae) // Display off
#define SET_ADC() Write_Instruction(0xa1) // Reverse disrect (SEG131-SEG0)
#define CLEAR_ADC() Write_Instruction(0xa0) // Normal disrect (SEG0-SEG131)
#define REVERSE_DISPLAY_ON() Write_Instruction(0xa7) // Reverse display : 0 illuminated
#define REVERSE_DISPLAY_OFF() Write_Instruction(0xa6) // Normal display : 1 illuminated
#define ENTIRE_DISPLAY_ON() Write_Instruction(0xa5) // Entire dislay Force whole LCD point
#define ENTIRE_DISPLAY_OFF() Write_Instruction(0xa4) // Normal display
#define SET_BIAS() Write_Instruction(0xa3) // bias 1
#define CLEAR_BIAS() Write_Instruction(0xa2) // bias 0
#define SET_MODIFY_READ() Write_Instruction(0xe0) // Stop automatic increment of the column address by the read instruction
#define RESET_MODIFY_READ() Write_Instruction(0xee) // Cancel Modify_read, column address return to its initial value just before the Set Modify Read instruction is started
#define RESET() Write_Instruction(0xe2)
#define SET_SHL() Write_Instruction(0xc8) // SHL 1,COM63-COM0
#define CLEAR_SHL() Write_Instruction(0xc0) // SHL 0,COM0-COM63
/*******************************************************************************************/
/*//////////////////// CC2500 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*\
/********************************************************************************************/
sbit SPI_CS = P0^2;
sbit SPI_SI = P0^5;
sbit SPI_SO = P0^3;
sbit SPI_SCK = P0^4;
//sbit SPI_GDO0 = P1^6;
//#define REPORT_LEN 8
#define PACKAGE_LEN 64
xdata uchar rxBuffer[PACKAGE_LEN];
// CC2500 狀態
//#define CCxxx0_Ready() SO
#define CRC_OK 0x80
#define BYTES_IN_RXFIFO 0x7F //突發訪問TX FIFO
#define STATE_IDLE 0x01
#define RSSI 0
#define LQI 1
// Definitions to support burst/single access:
#define WRITE_BURST 0x40
#define READ_SINGLE 0x80
#define READ_BURST 0xC0
//CC2500配置寄存器位于SPI地址從0x00到0x2F之間
#define CCxxx0_IOCFG2 0x00 // GDO2 輸出腳配置
#define CCxxx0_IOCFG1 0x01 // GDO1 輸出腳配置
#define CCxxx0_IOCFG0 0x02 // GDO0 輸出腳配置
#define CCxxx0_FIFOTHR 0x03 // RX FIFO and TX FIFO 門限
#define CCxxx0_SYNC1 0x04 // 同步詞匯,高字節
#define CCxxx0_SYNC0 0x05 // 同步詞匯,低字節
#define CCxxx0_PKTCTRL1 0x07 // 數據包自動控制
#define CCxxx0_PKTCTRL0 0x08 // 數據包自動控制
#define CCxxx0_ADDR 0x09 // 設備地址
#define CCxxx0_CHANNR 0x0A // 信道數
#define CCxxx0_FSCTRL1 0x0B // 頻率合成器控制
#define CCxxx0_FSCTRL0 0x0C // 頻率合成器控制
#define CCxxx0_FREQ2 0x0D // 頻率控制詞匯,高字節
#define CCxxx0_FREQ1 0x0E // 頻率控制詞匯,中間字節
#define CCxxx0_FREQ0 0x0F // 頻率控制詞匯,低字節
#define CCxxx0_MDMCFG4 0x10 // 調制器配置
#define CCxxx0_MDMCFG3 0x11 // 調制器配置
#define CCxxx0_MDMCFG2 0x12 // 調制器配置
#define CCxxx0_MDMCFG1 0x13 // 調制器配置
#define CCxxx0_MDMCFG0 0x14 // 調制器配置
#define CCxxx0_DEVIATN 0x15 // 調制器背離設置
#define CCxxx0_MCSM2 0x16 // 主通信控制狀態機配置
#define CCxxx0_MCSM1 0x17 // 主通信控制狀態機配置
#define CCxxx0_MCSM0 0x18 // 主通信控制狀態機配置
#define CCxxx0_FOCCFG 0x19 // 頻率偏移補償配置
#define CCxxx0_BSCFG 0x1A // 位同步配置
#define CCxxx0_AGCCTRL2 0x1B // AGC控制
#define CCxxx0_AGCCTRL1 0x1C // AGC控制
#define CCxxx0_AGCCTRL0 0x1D // AGC控制
#define CCxxx0_WOREVT1 0x1E // 高字節時間0暫停
#define CCxxx0_WOREVT0 0x1F // 低字節時間0暫停
#define CCxxx0_WORCTRL 0x20 // 電磁波激活控制
#define CCxxx0_FREND1 0x21 // 前末端RX配置
#define CCxxx0_FREND0 0x22 // 前末端TX配置
#define CCxxx0_FSCAL3 0x23 // 頻率合成器校準
#define CCxxx0_FSCAL2 0x24 // 頻率合成器校準
#define CCxxx0_FSCAL1 0x25 // 頻率合成器校準
#define CCxxx0_FSCAL0 0x26 // 頻率合成器校準
#define CCxxx0_RCCTRL1 0x27 // RC振蕩器配置
#define CCxxx0_RCCTRL0 0x28 // RC振蕩器配置
#define CCxxx0_FSTEST 0x29 // 頻率合成器校準控制
#define CCxxx0_PTEST 0x2A // 產品測試
#define CCxxx0_AGCTEST 0x2B // AGC 測試
#define CCxxx0_TEST2 0x2C // 不同的測試設置
#define CCxxx0_TEST1 0x2D // 不同的測試設置
#define CCxxx0_TEST0 0x2E // 不同的測試設置
//對0x30-0x3D間的地址來說,突發位用以在狀態寄存器和命令濾波之間選擇(如下)。
//狀態寄存器只讀。突發讀取對狀態寄存器是不可取的,故它們每次只能被讀一個。
//命令濾波 這些命令用來關閉晶體振蕩器,開啟傳輸模式和電磁波激活等
#define CCxxx0_SRES 0x30 // 重啟芯片
#define CCxxx0_SFSTXON 0x31 // 開啟和校準頻率合成器(若MCSM0.FS_AUTOCAL=1)
#define CCxxx0_SXOFF 0x32 // 關閉晶體振蕩器
#define CCxxx0_SCAL 0x33 // 校準頻率合成器并關斷(開啟快速啟動)
#define CCxxx0_SRX 0x34 // 啟用RX。若上一狀態為空閑且MCSM0.FS_AUTOCAL=1則首先運行校準。
#define CCxxx0_STX 0x35 // 空閑狀態:啟用TX。若MCSM0.FS_AUTOCAL=1首先運行校準。
// 在RX狀態且CCA啟用:若信道為空則進入TX
#define CCxxx0_SIDLE 0x36 // 離開RX/TX,關斷頻率合成器并離開電磁波激活模式若可用
#define CCxxx0_SAFC 0x37 // 運行頻率合成器的AFC調節
#define CCxxx0_SWOR 0x38 // 運行自動RX選舉序列(電磁波激活)
#define CCxxx0_SPWD 0x39 // 當CSn為高時進入功率降低模式。
#define CCxxx0_SFRX 0x3A // 沖洗RX FIFO緩沖
#define CCxxx0_SFTX 0x3B // 沖洗TX FIFO緩沖
#define CCxxx0_SWORRST 0x3C // 重新設置真實時間時鐘
#define CCxxx0_SNOP 0x3D // 無操作. 可能用來為更簡單的軟件將濾波命令變為2字節。
//狀態寄存器
#define CCxxx0_PARTNUM 0x30 //CC2550的組成部分數目
#define CCxxx0_VERSION 0x31 //當前版本數
#define CCxxx0_FREQEST 0x32 //頻率偏移估計
#define CCxxx0_LQI 0x33 //連接質量的解調器估計
#define CCxxx0_RSSI 0x34 //接收信號強度指示
#define CCxxx0_MARCSTATE 0x35 //控制狀態機狀態
#define CCxxx0_WORTIME1 0x36 //WOR計時器高字節
#define CCxxx0_WORTIME0 0x37 //WOR計時器低字節
#define CCxxx0_PKTSTATUS 0x38 //當前GDOx狀態和數據包狀態
#define CCxxx0_VCO_VC_DAC 0x39 //PLL校準模塊的當前設定
#define CCxxx0_TXBYTES 0x3A //TX FIFO中的下溢和比特數
#define CCxxx0_RXBYTES 0x3B //RX FIFO中的下溢和比特數
#define CCxxx0_RCCTRL1_STATUS 0x3C //RC振蕩器狀態
#define CCxxx0_RCCTRL0_STATUS 0x3D
#define CCxxx0_PATABLE 0x3E //用來選擇PA能量控制設置
#define CCxxx0_TXFIFO 0x3F //單字節訪問TX FIFO
#define CCxxx0_RXFIFO 0x3F
uchar package[64];
void SPI_WAIT()
{
uchar i;
for (i=0; i<10; i++);
}
void halWait(uint timeout)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--timeout);
}
void OpenSpi()
{
SPI_SCK =0;
SPI_SI =0;
SPI_CS =0;
while (SPI_SO);
}
void CloseSpi()
{
SPI_CS =1;
}
void WriteByte(uchar Data)
{
uchar i;//,temp_si;
for (i=0; i<8; i++)
{
if (Data&0x80)
SPI_SI=1;
else
SPI_SI=0;
_nop_();
_nop_();
_nop_();
SPI_SCK=1;
_nop_();
_nop_();
_nop_();
_nop_();
SPI_SCK=0;
Data<<=1;
}
}
uchar ReadByte()
{
uchar i;
uchar Data;
for (i=0; i<8; i++)
{
Data<<=1;
_nop_();
_nop_();
SPI_SCK=0;
if (SPI_SO)
Data |= 0x01;
else
Data &= 0xfe;
_nop_();
_nop_();
_nop_();
_nop_();
SPI_SCK=1;
_nop_();
_nop_();
}
return Data;
}
/*
uchar _crc_ibutton_update(uchar crc,uchar data_t)
{
uchar i;
crc = crc^data_t;
for (i = 0; i < 8; i++)
{
if (crc & 0x01)
crc = (crc >> 1)^0x8C;
else
crc >>= 1;
}
return crc;
}
// 8位CRC檢驗碼
uchar crc8_ibutton(uchar *data_t, uchar n)
{
char crc = 0x00;
while(n)
{
crc = _crc_ibutton_update(crc, *data_t ++);
--n;
}
return crc;
}*/
void SPI_Master_Init()
{
//設置SS SI SCK為輸出(P0.2 P0.5 P0.4)(11開漏輸出,10僅為輸入(高阻),01推挽(上拉),準雙向口),其他為輸入P0.3
P0M1 =0x08;
P0M2 =0x34;
P1M1 =0x40; //P1.2 P1.3只能配置為輸入口或開漏口。
P2M2 =0x00;
}/*
void mcu_init()
{
SPI_Master_Init();
}*/
void halSpiStrobe(BYTE strobe)
{
OpenSpi();
WriteByte(strobe);
SPI_WAIT();
CloseSpi();//拉高CS,數據發送完畢
}
BYTE halSpiReadReg(BYTE addr)
{
uchar x;
x=0;
OpenSpi();
WriteByte(addr|READ_SINGLE);
SPI_WAIT();
x=ReadByte();
CloseSpi();
return x;
}/**/
void halSpiWriteReg(BYTE addr,BYTE value)
{
OpenSpi();
WriteByte(addr);
SPI_WAIT();
WriteByte(value);
SPI_WAIT();
CloseSpi();
}
void halSpiWriteBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
uchar i;
OpenSpi();
WriteByte(addr|WRITE_BURST);
SPI_WAIT();
for(i=0;i<count;i++)
{
WriteByte(buffer[i]);
SPI_WAIT();
}
CloseSpi();
}
void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
uchar i;
OpenSpi();
WriteByte(addr|READ_BURST);
SPI_WAIT();
for(i=0;i<count;i++)
{
buffer[i]=ReadByte();
SPI_WAIT();
}
CloseSpi();
}/**/
BYTE halSpiReadStatus(BYTE addr)
{
uchar x;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -