📄 bt_arm.c
字号:
/* case HCI_Inquiry_Result_Event:
BTCOM_GetByte(&tbyte);//number response
// num_resp=tbyte;//更改
// for(i=0;i<num_resp;i++)
// {
BTCOM_GetByte(&tbyte);
inquiry_result.bd_addr.BD_ADDR[0]=tbyte;
BTCOM_GetByte(&tbyte);
inquiry_result.bd_addr.BD_ADDR[1]=tbyte;
BTCOM_GetByte(&tbyte);
inquiry_result.bd_addr.BD_ADDR[2]=tbyte;
BTCOM_GetByte(&tbyte);
inquiry_result.bd_addr.BD_ADDR[3]=tbyte;
BTCOM_GetByte(&tbyte);
inquiry_result.bd_addr.BD_ADDR[4]=tbyte;
BTCOM_GetByte(&tbyte);
inquiry_result.bd_addr.BD_ADDR[5]=tbyte;
// } // BTCOM_GetByte(&tbyte);
// inquiry_result.bd_addr.BD_ADDR[6]=tbyte;
// for(i=0;i<num_resp;i++)
// {
BTCOM_GetByte(&tbyte);
BTCOM_GetByte(&tbyte);
BTCOM_GetByte(&tbyte);
BTCOM_GetByte(&tbyte);
BTCOM_GetByte(&tbyte);
BTCOM_GetByte(&tbyte);
// }
// for(i=0;i<num_resp;i++)
// {
BTCOM_GetByte(&tbyte);
inquiry_result.clock_offset[0]=tbyte;
BTCOM_GetByte(&tbyte);
inquiry_result.clock_offset[1]=tbyte;
//}
break;*/
/* case HCI_Number_Of_Completed_Packets_Event:
BTCOM_GetByte(&tbyte);//number of Connection Handles;默认为一
BTCOM_GetByte(&tbyte);//Get Connection Handle
data_packet.handle[0]=tbyte;
BTCOM_GetByte(&tbyte);
data_packet.handle[1]=tbyte;
BTCOM_GetByte(&tbyte);//HCI_Num_Of_Completed_Packets
BTCOM_GetByte(&tbyte);
break;*/
default:
for(i=0;i<eventlength;i++)
BTCOM_GetByte(&tbyte);
break;
}
return 1;
}
/****************************************************************************
* 名称:HC595_SendDat()
* 功能:向74HC595发送一字节数据
* 入口参数:dat 要发送的数据
* 出口参数:无
* 说明:发送数据时,高位先发送。
****************************************************************************/
/*void HC595_SendDat(uint8 dat)
{
uint8 i;
IO0CLR = SPI_CS; // SPI_CS = 0
for(i=0; i<8; i++) // 发送8位数据
{
IO0CLR = SPI_CLK; // SPI_CLK = 0
/* 设置SPI_DATA输出值 *//*
if( (dat&0x80)!=0 ) IO0SET = SPI_DATA;
else IO0CLR = SPI_DATA;
dat <<= 1;
IO0SET = SPI_CLK; // SPI_CLK = 1
}
IO0SET = SPI_CS; // SPI_CS = 1,输出显示数据
}*/
/*************************************************************************/
/* 数码管显示字模表(0-F) */
/*************************************************************************/
const uint8 DISP_TAB[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0x88,0x83,0xC6,0xA1,0x86,0x8E };
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
uint8 rcv_counter;
UARTMODE UART0_set;
//PINSEL0 = 0x00005500;
PINSEL0 = 0x00005505; // 设置I/O连接到UART0
PINSEL1 = 0x20000000;
//PINSEL1 = 0x00000000;
//IO0DIR = SPI_IOCON|LEDCON|MAX1463_CS; // 设置LED1控制口为输出,其它I/O为输入
//IO0DIR = LED1CON|LED4CON|MAX1463_CS;
IO0DIR = LEDCON|MAX1463_CS;//|BT_Reset
rcv_new = 0;
UART0_set.datab = 8; // 8位数据位
UART0_set.stopb = 1; // 1位停止位
UART0_set.parity = 0; // 无奇偶校验
UART0_Ini(115200, UART0_set); // 初始化串口模式
/*使能UART0接收中断*/
U0FCR = 0x01; // 使能FIFO,并设置触发点为8字节
U0IER = 0x01; // 允许RBR中断,即接收中断
/***************************************************************************
*UART0中断控制设置
****************************************************************************/
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x00000040; // 使能UART0中断
/***************************************************************************
*EINT3中断控制设置
****************************************************************************/
EXTMODE = 0x08; // 设置EINT3中断为边沿触发模式
EXTPOLAR = 0x00; // 设置EINT3中断为下降沿触发
/* 打开EINT0中断(设置向量控制器,即使用向量IRQ) */
VICVectCntl1 = 0x20|17; // 分配EINT3中断到向量中断1
VICVectAddr1 = (int)IRQ_Eint3; // 设置中断服务程序地址
EXTINT = 0x08; // 清除EINT3中断标志
VICIntEnable = (1<<17); // 使能EINT3中断(1<<14)|
/****************************************************************************
*
*封装自己的程序
*
*****************************************************************************/
//IO0SET=BT_Reset;
//DelayNS(1);
//IO0CLR=BT_Reset;
rcv_counter = 0;
BTCOM_InitBuffer();
// HC595_SendDat(DISP_TAB[0]);
ProcessCommadEvent();
if (Rst_F==1)
{
IO0CLR = LEDCON;
DelayNS(100);
IO0SET = LEDCON;
DelayNS(100);
}
if (EvtFil_F==1)
{
IO0CLR = LEDCON;
DelayNS(100);
IO0SET = LEDCON;
DelayNS(100);
}
if (WPgScan_F==1)
{
IO0CLR = LEDCON;
DelayNS(100);
IO0SET = LEDCON;
DelayNS(100);
}
if (WInqScan_F==1)
{
IO0CLR = LEDCON;
DelayNS(100);
IO0SET = LEDCON;
DelayNS(100);
}
if (WScanEn_F==1)
{
IO0CLR = LEDCON;
DelayNS(100);
IO0SET = LEDCON;
DelayNS(100);
}
HCI_WaitConnection();
if(ConCplt_F==1)
{
IO0CLR = LEDCON;
DelayNS(100);
IO0SET = LEDCON;
DelayNS(100);
}
//Transfer_data();
//ProcessData();
//ProcessData();
//SendACLData();
//IO0CLR = MAX1463_CS;
//IO0CLR=LEDCON;
// DelayNS(100);
// IO0SET = MAX1463_CS;
//IO0SET = LEDCON;
//DelayNS(100);
MSpiIni();
InitADCDataBuf();
//Reset1463();
Start1463();
while(1) // 等待中断
{
if(ConnectionState==DISCONNECTED)
HCI_WaitConnection();
if(SysState!=SAMP_PAUSE)
{
if(Pause1463==1)
{
Pause1463=0;
//HCI_Exit_Sniff_Mode();
Start1463();
}
if(1==Adc_OK)
{
Adc_OK=0;
Halt1463();
//Test1463();
//ReadADCtoBuf();//
ReadRAWtoBuf();
if(Ln_OneTemp==0)
{
ReadTemp();
}
Ln_OneTemp++;
if(Ln_OneTemp==TLOOP)
Ln_OneTemp=0;
Start1463();
}
if(ADCDataBuf.cnt>=4)
{
GetData();
SendADCData();
if(ReadT==1)
{
SendTData();
ReadT=0;
}
}
}
else
{
Halt1463();
Pause1463=1;
//HCI_SniffMode();
ARM_idleMode();
}
/////////////////////
//IO0CLR=LEDCON;
//DelayNS(300);
//IO0SET = LEDCON;
//DelayNS(300);
//BTCOM_GetByte(&tbyte);
//BTCOM_GetByte(&tbyte);
//eventcode=tbyte;
//BTCOM_GetByte(&tbyte);
//eventlength=tbyte;
//IO0CLR=LEDCON;
//DelayNS(100);
//IO0SET = LEDCON;
//DelayNS(100);
//HCI_BTReset();
//ISendBuf();
//SendByte(0X36);
if(BTRxBuf.cnt>4)
GetPacket();
if(HostCommandState==SAMP_PAUSE)
SysState=SAMP_PAUSE;
if(HostCommandState==SAMP_RESUME)
SysState=SAMP_RESUME;
//data_packet; // 将接收到的数据发送回主机
//rcv_counter++; // 接收计数值加一
//HC595_SendDat(DISP_TAB[rcv_counter&0x0f]);
rcv_new = 0;
}
return(0);
}
/****************************************************************************
*convert 完成8位数据高低位的变换。即a8a7a6a5a4a3a2a1->a1a2a3a4a5a6a7a8
*1463 DI LSB 先发,DO MSB先发。ARM设定为LSB先发。故需转换一下
*****************************************************************************/
uint8 convert(uint8 ch)
{
uint8 a=0;
uint8 i;
for(i=0;i<7;i++)
{
a=a+(ch&0x01);
ch=ch>>1;
a=a<<1;
}
a=a+(ch&0x01);
return(a);
}
/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void MSpiIni(void)
{
S0PCCR = 0xE8; // 设置SPI时钟分频
S0PCR = 0x20; // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}
/****************************************************************************
* 名称:SPISend()
* 功能:向SPI总线发送数据。
* 入口参数:data 待发送的数据
* 出口参数:返回值为读取的数据
****************************************************************************/
uint8 SPISend(uint8 data)
{
uint8 SPIData;
SPIData=convert(data);
IO0CLR = MAX1463_CS; // 片选
S0PDR = SPIData;
while( 0==(S0PSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
IO0SET = MAX1463_CS;
return(S0PDR);
}
/***************************************************************************
*
****************************************************************************/
uint8 ReadDHR(void)
{
IO0CLR = MAX1463_CS;
S0PDR=0x20;
while( 0==(S0PSR&0x80) );
highbyte=S0PDR;
S0PDR=0xA0;
while( 0==(S0PSR&0x80) );
lowbyte=S0PDR;
PValue=highbyte<<8;
PValue=PValue+lowbyte;
IO0SET = MAX1463_CS;
return(0);
}
/**************************************************************************
*
***************************************************************************/
void Halt1463(void)
{
SPISend(0x78);
}
void Reset1463(void)
{
SPISend(0xB8);
}
void Test1463(void)
{
SPISend(0x13);
SPISend(0x22);
SPISend(0x31);
SPISend(0x40);
SPISend(0x19);
ReadDHR();
}
void Start1463(void)
{
SPISend(0x88);
}
/***************************************************************************
*
****************************************************************************/
void rwcode(uint16 sdata,uint16 saddr,uint8 smode)
{
uint16 a,rmessage[3];
uint8 scode[3][6],d1,d2,i,j;
rmessage[0]=sdata;
rmessage[1]=saddr;
if(smode==READ) rmessage[2]=0xC000; //1:read将要读取的值写入PD
else rmessage[2]=0x8000; //0:write
for(i=smode;i<=2;i++)
{
a=rmessage[i];
d1=(char)((a&0xFF00)>>8);
d2=(char)(a);
scode[i][0]=(d1&0xF0)+3;
scode[i][1]=((d1&0x0F)<<4)+2;
scode[i][2]=(d2&0xF0)+1;
scode[i][3]=((d2&0x0F)<<4)+0;
if(i==0)scode[i][4]=0xD4;
if(i==1)scode[i][4]=0xE4;
if(i==2)scode[i][4]=0xF4;
scode[i][5]=0x08;
for(j=0;j<=5;j++)
{
SPISend(scode[i][j]);
}
}
}
/****************************************************************************
*读1463寄存器模块 saddr:模块寄存器地址
*****************************************************************************/
void readmodreg(uint16 saddr,uint16 *RegValue)
{
uint16 sd,sa,sm;
sd=0;sa=saddr;sm=READ;
rwcode(sd,sa,sm);
SPISend(0xD4);
SPISend(0x28);
SPISend(0x19);
ReadDHR();
*RegValue=PValue;
}
void ARM_idleMode(void)
{
PCON=0x01;
}
void readport(uint8 portnum)
{
uint8 wtnum;
wtnum=(portnum<<4)+4;
SPISend(wtnum);
SPISend(0x28);
SPISend(0x19);
ReadDHR();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -