9c9d4d386ae4565ee5e423b243278bd7dd767af1.svn-base 13 KB

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