Main.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. /************************************************************************
  2. * ---- 居加居 ----
  3. * 文件名: Main.c
  4. * 编写人员: Kinve JQ
  5. * 说明:
  6. * 版本: V0.1
  7. * 编写日期: 2018-08-21
  8. * 程序维护:
  9. * 维护记录:
  10. * 2018-09-30.Kinve:1.创建文件
  11. * 免责声明:
  12. * (c) Author Kinve JQ. All rights reserved.
  13. **************************************************************************/
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include "Common.h"
  17. #include "Delay.h"
  18. #include "Timer.h"
  19. #include "Interrupt.h"
  20. #include "Flash.h"
  21. #include "Version.h"
  22. #include "Packdata.h"
  23. #include "DHT11.h"
  24. #include "Keys.h"
  25. #include "Adc.h"
  26. #define USE_2401_API
  27. #ifdef USE_2401_API
  28. #include "nRF24L01_API.h"
  29. #else
  30. #include "NRF24L01_inte.H"
  31. #define TX_PLOAD_WIDTH NRF24L01_TX_PLOAD_LEN
  32. #define RX_PLOAD_WIDTH NRF24L01_TX_PLOAD_LEN
  33. #endif
  34. unsigned char P12_Led_state = 0;
  35. unsigned char P04_Delay_state = 0;
  36. unsigned char Sys_Type = SysRun_Norm;
  37. //***********************************************************************************************************
  38. // Application: SPI Function
  39. // Master send 0x90 and recevie 0x4E
  40. // Master send 0x01 and recevie 0x55
  41. // Master send 0x02 and recevie 0x56
  42. // Master send 0x03 and recevie 0x4F
  43. // Master send 0x04 and recevie 0x54
  44. //
  45. // Master recevie 0x4E and 0x4F form slave after transmitting
  46. //***********************************************************************************************************
  47. //-----------------------------------------------------------------------------------------------------------
  48. void SPI_Error ( void )
  49. {
  50. DBG ( "\nSPI error.\n" );
  51. while ( 1 ) // SPI error and P0.7 flash/
  52. {
  53. P07 = 1;
  54. Timer0_Delay1ms ( 500 );
  55. P07 = 0;
  56. Timer0_Delay1ms ( 500 );
  57. }
  58. }
  59. //-----------------------------------------------------------------------------------------------------------
  60. void SPI_Initial ( void )
  61. {
  62. clr_SPIEN; //禁止SPI
  63. P15_Quasi_Mode; // P15 (SS) Quasi mode
  64. P10_Quasi_Mode; // P10(SPCLK) Quasi mode
  65. P00_Quasi_Mode; // P00 (MOSI) Quasi mode
  66. P01_Quasi_Mode; // P22 (MISO) Quasi mode
  67. //SS仅在从机有效
  68. set_DISMODF; // 1 = 禁止模式错误检测. SS的特征依赖SSOE 位
  69. clr_SSOE; // SS 作为 0.普通IO 1.自动拉低
  70. clr_LSBFE; // 0.MSB first
  71. clr_CPOL; // 0.SPI空闲时SCL为低
  72. clr_CPHA; // 0.在第1个边沿采样
  73. set_MSTR; // 主设备
  74. //SPICLK_DIV16; // Select SPI clock=1Mhz
  75. SPICLK_DIV4; // 16/4=4Mhz, 24l01速度不能太快,最大的数据传输率为 10Mbps
  76. set_SPIEN; // 使能SPI
  77. clr_SPIF; // 清标志位
  78. }
  79. //-----------------------------------------------------------------------------------------------------------
  80. void Start_Sending_SPI ( uint8 *pu8MID, uint8 *pu8DID )
  81. {
  82. SS = 0;
  83. SPDR = 0x90;
  84. Timer3_Delay10us ( 1 ); // Send 0x90 to Slave
  85. while ( ! ( SPSR & SET_BIT7 ) );
  86. clr_SPIF;
  87. if ( SPDR != 0x4E )
  88. SPI_Error();
  89. DBG ( "\nSlave Return %c!\n", SPDR );
  90. SPDR = 0x01; // Send 0x01 to Slave
  91. Timer3_Delay10us ( 1 );
  92. while ( ! ( SPSR & SET_BIT7 ) );
  93. clr_SPIF;
  94. if ( SPDR != 0x55 )
  95. SPI_Error();
  96. DBG ( "\nSlave Return %c!\n", SPDR );
  97. SPDR = 0x02; // Send 0x02 to Slave
  98. Timer3_Delay10us ( 1 );
  99. while ( ! ( SPSR & SET_BIT7 ) );
  100. clr_SPIF;
  101. if ( SPDR != 0x56 )
  102. SPI_Error();
  103. DBG ( "\nSlave Return %c!\n", SPDR );
  104. SPDR = 0x03; // Send 0x03 to Slave
  105. Timer3_Delay10us ( 1 );
  106. while ( ! ( SPSR & SET_BIT7 ) );
  107. clr_SPIF;
  108. if ( SPDR != 0x4F )
  109. SPI_Error();
  110. DBG ( "\nSlave Return %c!\n", SPDR );
  111. SPDR = 0x04; // Send 0x04 to Slave
  112. Timer3_Delay10us ( 1 );
  113. while ( ! ( SPSR & SET_BIT7 ) );
  114. clr_SPIF;
  115. if ( SPDR != 0x54 )
  116. SPI_Error();
  117. DBG ( "\nSlave Return %c!\n", SPDR );
  118. SPDR = 0xFF;
  119. Timer3_Delay10us ( 1 );
  120. while ( ! ( SPSR & SET_BIT7 ) );
  121. clr_SPIF;
  122. *pu8MID = SPDR; // Receive Slave 1st DATA from Slave
  123. DBG ( "\nSlave Return %c!\n", SPDR );
  124. SPDR = 0xFF;
  125. Timer3_Delay10us ( 1 );
  126. while ( ! ( SPSR & SET_BIT7 ) );
  127. clr_SPIF;
  128. *pu8DID = SPDR; // Receive Slave 2nd DATA from Slave
  129. DBG ( "\nSlave Return %c!\n", SPDR );
  130. SS = 1;
  131. }
  132. //1.关闭POR (TA 保护) 上电复位(检测电源上升到系统可以工作的电压)
  133. #ifdef N76E003_IAR
  134. __sfr __no_init volatile unsigned char PORDIS @ 0XFD;
  135. #else
  136. sfr PORDIS = 0XFD;
  137. #endif
  138. void CLOSE_POR ( void )
  139. {
  140. TA = 0XAA;
  141. TA = 0X55;
  142. PORDIS = 0X5A;
  143. TA = 0XAA;
  144. TA = 0X55;
  145. PORDIS = 0XA5;
  146. }
  147. /******************************************************************************
  148. This code illustrates how to do APROM and CONFIG IAP from LDROM.
  149. APROM are re-programmed by the code to output P1 as 55h and P0 as aah.
  150. The CONFIG2 is also updated to disable BOD reset.
  151. User needs to configure CONFIG0 = 0x7F, CONFIG1 = 0xFE, CONFIG2 = 0xFF.
  152. ******************************************************************************/
  153. //2.关闭BOD 欠压检测 (监测运行期间VDD电平)
  154. #ifdef N76E003_IAR
  155. __sfr __no_init volatile unsigned char BODCON0 @ 0XA3;
  156. __sfr __no_init volatile unsigned char BODCON1 @ 0XAB;
  157. //__sfr __no_init volatile unsigned char CONFIG2 @ 0XFD;
  158. #else
  159. //sfr BODCON0 = 0XA3;
  160. //sfr BODCON1 = 0XAB;
  161. #endif
  162. void CLOSE_BOD ( void )
  163. {
  164. BODCON0 &= ~ ( 1 << 7 ); //0 =禁用欠压检测电路
  165. }
  166. enum
  167. {
  168. UMKNOW_RESET,
  169. POWER_ON_RESET, //上电复位
  170. BROWN_OUT_RESET, //欠压复位
  171. RST_PIN_RESET, //RST引脚复位
  172. HARD_FAULT_RESET, //硬件故障复位
  173. WATCHGOD_TIMER_RESET, //看门狗定时器复位
  174. SOFTWARE_RESET, //软件复位
  175. MAX_RESET
  176. };
  177. /*
  178. RST pin reset
  179. Brown-out reset
  180. Software reset
  181. Power-on reset
  182. Watchgod Timer reset
  183. Hard Fault reset
  184. */
  185. unsigned char Reset_Reason ( void )
  186. {
  187. unsigned char res = UMKNOW_RESET;
  188. if ( PCON & ( 1 << 4 ) )
  189. {
  190. PCON &= ~ ( 1 << 4 );
  191. res = POWER_ON_RESET;
  192. }
  193. if ( BODCON0 & ( 1 << 1 ) )
  194. {
  195. BODCON0 &= ~ ( 1 << 1 );
  196. res = BROWN_OUT_RESET;
  197. }
  198. if ( AUXR1 & ( 1 << 6 ) )
  199. {
  200. AUXR1 &= ~ ( 1 << 6 );
  201. res = RST_PIN_RESET;
  202. }
  203. if ( AUXR1 & ( 1 << 5 ) )
  204. {
  205. AUXR1 &= ~ ( 1 << 5 );
  206. res = HARD_FAULT_RESET;
  207. }
  208. if ( WDCON & ( 1 << 3 ) )
  209. {
  210. WDCON &= ~ ( 1 << 3 );
  211. res = WATCHGOD_TIMER_RESET;
  212. }
  213. if ( AUXR1 & ( 1 << 7 ) )
  214. {
  215. AUXR1 &= ~ ( 1 << 7 );
  216. res = SOFTWARE_RESET;
  217. }
  218. return res;
  219. }
  220. void ResetSys ( void )
  221. {
  222. AUXR1 &= ~ ( 1 << 7 ); //software reset flag clear
  223. EA = 0;
  224. TA = 0xAA;
  225. TA = 0x55;
  226. CHPCON |= ( 1 << 7 ); //software reset
  227. }
  228. void P12_Flash ( unsigned char num )
  229. {
  230. unsigned char i;
  231. for ( i = 0; i < num && num < 5 ; i++ )
  232. {
  233. P12 = 1;
  234. Timer3_Delay100ms ( 1 );
  235. P12 = 0;
  236. Timer3_Delay100ms ( 1 );
  237. }
  238. P12_Led_state = P12;
  239. }
  240. #if 0
  241. unsigned char flag;
  242. //NRF24L01中断处理
  243. #ifdef N76E003_IAR
  244. #pragma vector=0x3B
  245. __interrupt void NRF24L01_Handler ( void )
  246. #else
  247. void NRF24L01_Handler ( void ) interrupt 7 //interrupt address is 0x001B
  248. #endif
  249. {
  250. clr_EPI; //关闭管脚中断7
  251. flag = PIF;
  252. PIF = 0x00; //清除全部标志
  253. DBG ( "\nNRF24L01 interrupt!\n" );
  254. set_EPI; //开启管脚中断7
  255. }
  256. void NRF24L01_Interrupt_P03 ( void )
  257. {
  258. //P0M1|=SET_BIT3;P0M2&=~SET_BIT3; //input
  259. PICON &= ~ ( SET_BIT0 | SET_BIT1 );
  260. PICON |= ( 0x00 ); //[1:0]=0.端口0
  261. PICON |= SET_BIT5; //通道3=1.边沿触发
  262. PINEN |= SET_BIT3; // 1 = 低电平/ 下降沿触发中断
  263. PIPEN &= ~SET_BIT3; //0 = 关闭中断(高电平/ 上升沿触发中断)
  264. EIE |= SET_BIT1; //管脚中断,最多8个,中断号7
  265. EA = 1; //总中断
  266. }
  267. #endif
  268. //96位 UID与128位UCID
  269. unsigned char xdata UIDBuf[12]; //本机的存储96bit的UID内容
  270. unsigned char xdata UID_Master[12]; //主机的存储96bit的UID内容
  271. UINT8 UID_BYTE ( UINT8 Addr )
  272. {
  273. UINT8 DATATEMP;
  274. set_IAPEN;
  275. IAPAL = Addr;
  276. IAPAH = 0x00;
  277. IAPCN = READ_UID;
  278. set_IAPGO;
  279. DATATEMP = IAPFD;
  280. clr_IAPEN;
  281. return DATATEMP;
  282. }
  283. //读出芯片的96bit的UID
  284. void ReadUID_UCID ( UINT8 UID, UINT8 *out )
  285. {
  286. UINT8 i;
  287. for ( i = 0; i < 12; i++ )
  288. {
  289. out[i] = UID_BYTE ( i + UID ); //ucid=0x20
  290. }
  291. }
  292. int Humi,Temp,Light; //printf 用int
  293. //最长4byte
  294. #define GET_VER_POS(NUM,VER) ((VER>>(8*NUM))&0xff)
  295. //-----------------------------------------------------------------------------------------------------------
  296. void main ( void )
  297. {
  298. unsigned char reset_num, i;
  299. //unsigned char datatemp[8];
  300. unsigned char TxBuf[TX_PLOAD_WIDTH] = {'>', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; //
  301. unsigned char RxBuf[RX_PLOAD_WIDTH] = {0};
  302. unsigned char PackBuf[TX_PLOAD_WIDTH];
  303. pDataBuff CheckRxBuf = {0};
  304. unsigned char CheckUID = 0;
  305. //uint8 u8MID, u8DID;
  306. reset_num = Reset_Reason();
  307. CLOSE_POR();
  308. CLOSE_BOD();
  309. Set_All_GPIO_Quasi_Mode;
  310. //NRF24L01_Interrupt_P03();
  311. //定时器
  312. Timer0_init ( TIMER_SCAN ); //1ms
  313. //ResetSys();
  314. InitialUART0_Timer1 ( 115200 ); /* 115200 Baud Rate*/
  315. Timer3_Delay10us ( 1000 );
  316. DBG ( "\nHome Light %s, Build by Kinve in %ld\n", THIS_VER, CUSTOM_VER );
  317. ReadUID_UCID ( 0x00, UIDBuf ); //0x00=uid 0x20=ucid
  318. DBG ( "UID=%x%x%x%x\n", UIDBuf[0], UIDBuf[1], UIDBuf[2], UIDBuf[3] );
  319. #if 0
  320. //call read byte
  321. datatemp[5] = Read_APROM_BYTE ( 0x3885 );
  322. if ( datatemp[5] != 0x4A )
  323. {
  324. //call write byte
  325. for ( i = 0; i < sizeof ( datatemp ); i++ )
  326. {
  327. if ( i == 5 ) Write_DATAFLASH_BYTE ( 0x3880 + i, 0x4A );
  328. else Write_DATAFLASH_BYTE ( 0x3880 + i, GET_VER_POS ( i, CUSTOM_VER ) );
  329. datatemp[i] = Read_APROM_BYTE ( ( UINT16 code * ) ( 0x3880 + i ) );
  330. }
  331. }
  332. #endif
  333. for ( i = 0; i < sizeof ( UID_Master ); i++ )
  334. {
  335. UID_Master[i] = Read_APROM_BYTE ( ( UINT16 code * ) ( 0x3881 + i ) );
  336. }
  337. if(Fast_Check_CS())
  338. {
  339. Sys_Type = SysRun_Test;
  340. }
  341. SPI_Initial();
  342. NRF24L01_Wait_Check(); // 等待检测到NRF24L01,程序才会向下执行
  343. NRF24L01_RT_Init ();
  344. DBG ( "NRF24L01 init OK!\n" );
  345. while ( 1 )
  346. {
  347. switch(Sys_Type)
  348. {
  349. case SysRun_Test:
  350. if ( System_Flag_500Ms)
  351. {
  352. System_Flag_500Ms = 0;
  353. P12_Led_state = !P12_Led_state;
  354. P12 = P12_Led_state;
  355. }
  356. if(Keys[KEY_CS].Res == ONE_HITS_KEY_FLAG) //本机请求ID
  357. {
  358. Keys[KEY_CS].Res = NO_KEY_FLAG;
  359. memset(TxBuf, 0, sizeof(TxBuf));
  360. TxBuf[0] = '*'; //*(1byte)+?(1byte)
  361. TxBuf[1] = '?';
  362. PackData(TxBuf, 2, PackBuf);
  363. SEND_BUF ( PackBuf, sizeof(PackBuf) );
  364. DBG ( "Send: %s\n", &PackBuf[2] );
  365. }
  366. if(Keys[KEY_CS].Res == LONG_KEY_FLAG) //删除配对ID
  367. {
  368. Keys[KEY_CS].Res = NO_KEY_FLAG;
  369. //保存到flash
  370. memset(UID_Master, 0xFF, sizeof(UID_Master));
  371. Write_DATAFLASH_BYTE ( 0x3880, 0xFF );
  372. for ( i = 0; i < sizeof ( UID_Master ); i++ )
  373. {
  374. Write_DATAFLASH_BYTE ( 0x3881 + i, UID_Master[i] );
  375. }
  376. P12_Flash(4);
  377. DBG ( "Clear Pair Num\n" );
  378. }
  379. break;
  380. case SysRun_Norm:
  381. default:
  382. if ( System_Flag_1s )
  383. {
  384. System_Flag_1s = 0;
  385. P12_Led_state = !P12_Led_state;
  386. P12 = P12_Led_state;
  387. //温湿度获取
  388. DHT11_Read_Data( &DHT11_Data );
  389. Adc_read();
  390. if( abs(Light-Group_Light) > 10 ){
  391. Humi = DHT11_Data.humi_int;
  392. Temp = DHT11_Data.temp_int;
  393. Light = Group_Light;
  394. DBG ( "Humi:%02u%% - Temp:%02uC - Light:%02u\n", Humi, Temp, Light );
  395. }
  396. }
  397. if(Keys[KEY_CS].Res == ONE_HITS_KEY_FLAG)//配对发
  398. {
  399. Keys[KEY_CS].Res = NO_KEY_FLAG;
  400. memset(TxBuf, 0, sizeof(TxBuf));
  401. TxBuf[0] = '>'; //*(1byte)+?(1byte)
  402. TxBuf[1] = 'L'; //灯
  403. TxBuf[2] = 'T'; //翻转
  404. memcpy(&TxBuf[3], UID_Master, 12);
  405. PackData(TxBuf, 15, PackBuf);
  406. SEND_BUF ( PackBuf, sizeof(PackBuf) );
  407. DBG ( "Send: %s\n", &PackBuf[2] );
  408. }
  409. break;
  410. }
  411. if ( NRF_IRQ == 0 )
  412. {
  413. if ( NRF24L01_RxPacket ( RxBuf, sizeof ( RxBuf ) ) )
  414. {
  415. if(CheckData(RxBuf, RX_PLOAD_WIDTH, &CheckRxBuf)){
  416. P12_Flash ( 2 );
  417. DBG ( "Recv: %s\n", &(CheckRxBuf.Data[2]) );
  418. switch(CheckRxBuf.Data[2]){
  419. case '*': //配对
  420. switch(CheckRxBuf.Data[3]){
  421. case '?': //对方收到,发送ID
  422. memset(TxBuf, 0, sizeof(TxBuf));
  423. TxBuf[0] = '*'; //*(1byte)+Y(1byte)+uid(12byte)
  424. TxBuf[1] = '1';
  425. memcpy(&TxBuf[2], UIDBuf, 12);
  426. PackData(TxBuf, 14, PackBuf);
  427. SEND_BUF ( PackBuf, sizeof(PackBuf) );
  428. DBG ( "Send: %s\n", &PackBuf[2] );
  429. break;
  430. case '1': //本机收到,保存ID
  431. memcpy(UID_Master, &CheckRxBuf.Data[4], 12);
  432. //保存到flash
  433. Write_DATAFLASH_BYTE ( 0x3880, 0x4A );
  434. for ( i = 0; i < sizeof ( UID_Master ); i++ )
  435. {
  436. Write_DATAFLASH_BYTE ( 0x3881 + i, UID_Master[i] );
  437. }
  438. //返回成功
  439. memset(TxBuf, 0, sizeof(TxBuf));
  440. TxBuf[0] = '*'; //*(1byte)+Y(1byte)+uid(10byte)
  441. TxBuf[1] = '2';
  442. PackData(TxBuf, 2, PackBuf);
  443. SEND_BUF ( PackBuf, sizeof(PackBuf) );
  444. DBG ( "Send: %s\n", &PackBuf[2] );
  445. DBG ( "Pair Save OK\n" );
  446. break;
  447. case '2': //对方收到,我已保存ID
  448. DBG ( "One Client Pair OK\n" );
  449. break;
  450. }
  451. break;
  452. case '>': //数据
  453. switch(CheckRxBuf.Data[3]){
  454. case 'L':
  455. if(CheckRxBuf.Data[4] == 'T'){
  456. CheckUID = 0;
  457. if(0 == memcmp(&(CheckRxBuf.Data[5]), UIDBuf, 12)){
  458. P04_Delay_state = !P04_Delay_state;
  459. P04 = P04_Delay_state;
  460. CheckUID = 1;
  461. }
  462. //返回成功
  463. memset(TxBuf, 0, sizeof(TxBuf));
  464. TxBuf[0] = '<'; //*(1byte)+Y(1byte)+uid(10byte)
  465. TxBuf[1] = 'L';
  466. TxBuf[2] = 'T';
  467. TxBuf[3] = CheckUID?'Y':'N';
  468. PackData(TxBuf, 4, PackBuf);
  469. SEND_BUF ( PackBuf, sizeof(PackBuf) );
  470. DBG ( "Send: %s\n", &PackBuf[2] );
  471. }
  472. break;
  473. }
  474. break;
  475. }
  476. }
  477. }
  478. }
  479. }
  480. }
  481. //-----------------------------------------------------------------------------------------------------------
  482. /*************** (C) COPYRIGHT Kinve JQ *******END OF FILE **************/