Compare commits

...

146 Commits

Author SHA1 Message Date
Roy 0865580637 pending: update spi code 2023-05-16 18:11:53 +08:00
LuoYiTing 5f6b3ba7e5 Doc: update README.md - install IDE
process
2023-04-27 02:17:29 +00:00
LuoYiTing 84f2016346 Doc: update README.md - install IDE
process
2023-04-25 07:41:29 +00:00
LuoYiTing 4597e042fe Doc: update README.md - install IDE
process
2023-04-24 07:35:35 +00:00
Roy bd7c6e7567 [cali] add BOARD_38/39/40 calibration data. 2023-04-18 11:46:38 +08:00
Roy faca2637d0 [cali] update BOARD_37 calibration data. 2023-04-10 14:04:54 +08:00
Roy 4bb99ccfc9 [cali] update BOARD_36 calibration data. 2023-04-10 14:01:28 +08:00
Roy 7e16710cdd [cali] update BOARD_35 calibration data. 2023-04-07 11:31:26 +08:00
Roy 8e10e98e79 [cali] update BOARD_34 calibration data. 2023-04-07 11:29:03 +08:00
ROY 9493fd9a1b [cali] update BOARD_34 calibration data. 2023-03-31 12:08:29 +08:00
ROY 98ae27edf4 [cali] update BOARD_36 calibration data. 2023-03-30 16:12:21 +08:00
ROY f5213ffe60 [cali] update BOARD_37 calibration data. 2023-03-29 14:19:05 +08:00
ROY 6e8e974e04 [cali] update BOARD_36 calibration data. 2023-03-25 13:51:08 +08:00
ROY d7c2bc3fbb [cali] add BOARD_37 calibration data. 2023-03-24 17:37:50 +08:00
ROY d18bc134b8 [cali] add BOARD_36 calibration data. 2023-03-24 10:30:26 +08:00
ROY f58407f238 [cali] update BOARD_35 calibration data. 2023-03-24 10:26:46 +08:00
ROY b9f169d8f7 [cali] update BOARD_34 calibration data. 2023-03-24 10:23:05 +08:00
ROY c5aa04e8e2 [cali] update BOARD_C7_05 calibration data. 2023-03-21 10:36:57 +08:00
ROY 550c424d32 [cali] update BOARD_F0_10 calibration data. 2023-03-21 10:33:52 +08:00
ROY 1bb045ae27 [cali] update BOARD_27 calibration data.(Vmon) 2023-03-14 16:20:36 +08:00
ROY aced7380a9 [cali] update BOARD_ED_5A & BOARD_21 & BOARD_25 & BOARD_28 & BOARD_32 calibration data.(Vmon) 2023-03-14 14:49:45 +08:00
ROY b9685340b3 [cali] update BOARD_15 & BOARD_17 & BOARD_24 & BOARD_31 calibration data.(Vmon) 2023-03-14 13:21:24 +08:00
ROY 0c690e9503 [update] update notify buff 2023-03-07 17:41:17 +08:00
ROY 52c4cba192 [cali] add BOARD_34 & BOARD_35 calibration data. 2023-03-07 16:36:28 +08:00
ROY 0dd9a20114 [update] notify Voutin data 2023-03-07 13:42:36 +08:00
ROY 4d6bd34faa [cali] update BOARD_EF_50 calibration data. 2023-03-07 10:20:00 +08:00
ROY e7ca6205d1 [cali] update BOARD_EF_30 calibration data. 2023-03-06 16:16:26 +08:00
ROY fcd6f9bd3f [cali] update BOARD_EF_50 calibration data. 2023-03-06 16:14:12 +08:00
ROY 6df8353ca7 [update] fix cp_devis & first vout - 5mV on cp mode 2023-02-24 12:38:14 +08:00
ROY 5f7cac01d3 [cali] update BOARD_14 & Voutin (Vopen) calibration data. 2023-02-24 12:36:40 +08:00
ROY 8c8cd6b55a [cali] update BOARD_14 Voutin calibration data. 2023-02-24 10:01:10 +08:00
ROY 8622ed2057 [cali] update BOARD_E7_74 Voutin calibration data. 2023-02-24 08:54:12 +08:00
ROY bb535e2c64 [update] improve speed of changing volt on cp mode 2023-02-23 15:52:35 +08:00
ROY a04cec2dad [cali] update BOARD_EE_EF calibration data. 2023-02-23 15:48:07 +08:00
ROY d62c2814ea [cali] update BOARD_33 calibration data. 2023-01-04 12:04:44 +08:00
ROY 55866be4ed [cali] add BOARD_32 calibration data. 2022-12-22 09:22:21 +08:00
ROY 2e615c7e74 [cali] add BOARD_31 calibration data. 2022-12-20 18:21:36 +08:00
ROY a17bd344af [cali] add BOARD_30 calibration data. 2022-12-20 18:12:40 +08:00
ROY 0667c9397f [cali] add BOARD_29 calibration data. 2022-12-20 18:09:54 +08:00
ROY 40ad3b62fb [update] stop condition on CC mode 2022-12-02 17:28:16 +08:00
ROY 8cddab21ab [update] revert to v1.18.0 2022-12-02 15:37:44 +08:00
ROY b09afc4699 debug cp 2022-09-21 11:24:37 +08:00
ROY ea9cc17494 [update] don't print 200ms of leading time 2022-09-19 17:07:13 +08:00
ROY 8be6e779fa [update] cp mode finished and update version 2022-09-16 10:57:02 +08:00
ROY aa864aad9a Merge branch 'dev/edc1.5re/cp_mode' into elite/edc1.5re 2022-09-16 10:55:34 +08:00
ROY a97f5a0fb1 [update] fix cp mode 2022-09-16 10:55:15 +08:00
ROY f8520cdcfd [cali] add BOARD_28 calibration data. 2022-09-13 18:20:42 +08:00
ROY 276b793687 [cali] add BOARD_27 calibration data. 2022-09-13 18:17:17 +08:00
ROY 45fc016bd5 [cali] add BOARD_26 calibration data. 2022-09-13 18:14:41 +08:00
ROY 78177025de [cali] add BOARD_25 calibration data. 2022-09-13 18:11:57 +08:00
ROY c1cd6260b7 [cali] add BOARD_24 calibration data. 2022-09-13 18:08:32 +08:00
ROY 9e1a734c3d [cali] add BOARD_23 calibration data. 2022-09-13 18:00:29 +08:00
ROY 2ba852f6d5 [cali] add BOARD_22 calibration data. 2022-09-13 17:56:54 +08:00
ROY 5495362f46 [update] ok 2022-09-13 16:23:31 +08:00
ROY e75a837994 [update] cp_mode v2 ok 2022-09-13 15:45:19 +08:00
ROY 4480b34948 [update] cp_mode v1 ok 2022-09-13 15:29:01 +08:00
ROY 5ac63bbce4 not ok 2022-09-12 16:35:39 +08:00
ROY f15971c28a [update] disconnect timeout is yellow green LED 2022-08-30 09:42:15 +08:00
ROY f6f0e47ee7 Merge remote-tracking branch 'origin/dev/edc1.5re_battery' into elite/edc1.5re 2022-08-30 09:31:39 +08:00
sss28072637 099d1ec72e [update] battery calibration 2022-08-30 09:25:13 +08:00
JayC319 fbb98c3c24 [update] fix cali_DAC mode 2022-08-22 13:46:17 +08:00
ROY c8c101ae98 [update] fix CC mode and CP mode 2022-08-18 18:50:19 +08:00
JayC319 ad1ed81f00 [update] cali mode stop issue fixed 2022-08-17 10:09:02 +08:00
ROY 69416bc58e [update] merge cali mode branch 2022-08-16 11:37:04 +08:00
ROY 9c29ad0a86 [update] new dev tool function: LED 2022-08-11 15:58:46 +08:00
ROY 6b421d73e9 [update] fix start voltage on cc/cp mode 2022-08-11 11:14:12 +08:00
ROY 34107872ec [update] rel/elite/edc1.5/v1.15.0 2022-08-10 17:16:50 +08:00
ROY f6719c3182 [update] update model name 2022-08-05 16:28:28 +08:00
ROY 79188d76b9 [update] new cp mode (cc cp separate) 2022-08-04 18:14:43 +08:00
ROY 3e5c9b9b73 [update] clean up the code 2022-08-03 17:06:08 +08:00
ROY f1fa366b8f [update] clean up the code 2022-08-03 16:22:08 +08:00
ROY 16814ad816 [cali] add BOARD_20 calibration data. 2022-08-02 16:32:08 +08:00
ROY 92ae63b7f9 [cali] add BOARD_19 calibration data. 2022-08-02 16:29:45 +08:00
ROY 1f3e7a5efe [cali] add BOARD_21 calibration data. 2022-08-02 16:03:08 +08:00
ROY c573135e98 [update] VIN_GAIN_MID1_BOUNDARY2 = 290mV 2022-08-02 11:33:04 +08:00
ROY 5d4c5b5a86 Merge branch 'dev/elite1.5re/fix_auto_gain' into elite/edc1.5re 2022-08-01 18:12:59 +08:00
ROY caf6985e66 [update] fix auto gain 2022-08-01 18:12:25 +08:00
ROY a7a1f7f2b5 [update] fix gain 2022-07-29 13:09:24 +08:00
ROY 45182935b7 [update] remove CC_ZERO mode and fix gain 2022-07-29 11:31:26 +08:00
ROY 6958c410a1 [update] move device info 2022-07-29 09:38:29 +08:00
ROY a337434903 [update] delete unused file 2022-07-28 17:55:40 +08:00
ROY 14c897c26e [update] delete unused file 2022-07-28 17:54:32 +08:00
ROY 02a6018cac [update] delete Elite.json 2022-07-28 17:53:40 +08:00
ROY 544b571f85 [note] fix mode enum 2022-07-28 17:52:41 +08:00
ROY 939de9098a [update] fix step time on IV & Cycle-IV mode 2022-07-28 16:32:55 +08:00
ROY 7441d9a5c8 [cali] add BOARD_18 calibration data. 2022-07-28 11:48:03 +08:00
ROY a680f59277 [cali] add BOARD_17 calibration data. 2022-07-28 11:45:24 +08:00
ROY b595215326 [update] limit volt = 100mV on cc mode 2022-07-28 10:57:38 +08:00
ROY 901108ea90 [update] fix main loop 2022-07-28 10:09:04 +08:00
ROY 16dc76833a [update] update device info 2022-07-27 10:16:15 +08:00
JayC319 e6993f5a4a [update] minor changes and instruction added 2022-07-22 14:39:04 +08:00
ROY a2b5a5728b [update] update adc function 2022-07-22 14:09:24 +08:00
JayC319 4d76e4585e [update] variable name changed 2022-07-22 13:14:03 +08:00
JayC319 43e72567c0 [update] ADC modulized small fix 2022-07-22 13:04:03 +08:00
ROY 311f0d1238 Merge branch 'dev/eliteedc1.5re/merge_latch_adc_dac' into elite/edc1.5re 2022-07-22 10:19:17 +08:00
ROY 7177e8549b [update] merge latch & adc & dac code 2022-07-22 10:19:01 +08:00
ROY 7106f59122 Merge branch 'dev/roy/latch' into test 2022-07-22 09:59:16 +08:00
ROY 2c203b73a1 [update] update latch process 2022-07-22 09:57:01 +08:00
JayC319 ba7552e091 [update] "latest version" 2022-07-22 09:48:14 +08:00
JayC319 4b65c8666e Merge branch 'dev/ADC_modulize' of https://gitlab.com/wisetop/microchip/application/cc2650/wtp_cc2650_development into dev/ADC_modulize 2022-07-22 09:44:09 +08:00
JayC319 5dc35425d5 [update] ADC modulized done and ADC rx buffer revised 2022-07-22 09:41:39 +08:00
JayC319 790db4bcf4 [update] DAC modulized finished and DAC rx buffer revised 2022-07-22 09:26:12 +08:00
ROY d9cc6f2ba6 [update] update latch process 2022-07-21 17:34:17 +08:00
ROY 5e04fcb7e2 [update] update latch process 2022-07-21 17:29:31 +08:00
ROY dc5cabf2ae [update] update latch process 2022-07-21 15:20:50 +08:00
ROY 7cf60e2717 [update] update latch process 2022-07-21 14:12:41 +08:00
JayC319 f1ab4be88a [update] adc modulized first version done and dac modulize revision 2022-07-19 17:47:04 +08:00
JayC319 3509b6df00 Merge branch 'dev/1.5re/DAC_modulize' into dev/elite/edc1.5re/merge_dac_and_cc_mode 2022-07-18 18:57:48 +08:00
JayC319 26b37b759f Merge branch 'dev/1.5re/DAC_modulize' into dev/elite/edc1.5re/merge_dac_and_cc_mode 2022-07-18 18:57:03 +08:00
JayC319 6321fdca51 [update] DAC_modulized function ok 2022-07-18 18:20:01 +08:00
ROY c496ccb791 [update] fix charge/discharge problem on cc mode 2022-07-15 21:48:13 +08:00
JayC319 c8aeabdfeb [update] DAC_modulized function ok 2022-07-14 18:11:22 +08:00
JayC319 9bfc251029 [update] DAC_modulized 2022-07-14 17:09:25 +08:00
JayC319 0273a9571b [update] nono 2022-07-13 19:05:06 +08:00
JayC319 5318a89132 [update] button and LED modulizing finished 2022-07-12 15:45:02 +08:00
JayC319 a4f653951e [update] finished button modulized 2022-07-12 10:46:18 +08:00
JayC319 925447817f [update] check comiler 2022-07-11 14:34:28 +08:00
JayC319 b64a3d031f [update] boardselect changed, Elite_PIN.h delete 2022-07-08 14:06:04 +08:00
JayC319 6fc7b2591f [update] gpio modulize 2022-07-07 17:58:16 +08:00
JayC319 00cc58e720 [update]modulize_LED 2022-07-06 18:06:18 +08:00
ROY fcc1477acd [cali] add BOARD_16 calibration data. 2022-07-04 17:59:09 +08:00
ROY 545fc8323c [update] remove old pulse mode 2022-07-04 10:50:02 +08:00
ROY 4c654982d2 [cali] add BOARD_15 calibration data. 2022-07-04 10:25:05 +08:00
ROY d7a4e02349 [cali] add BOARD_14 calibration data. 2022-07-04 10:22:00 +08:00
ROY ee1d052c3a [cali] add BOARD_13 calibration data. 2022-06-22 15:36:50 +08:00
ROY 7acafa81b8 [cali] add BOARD_12 calibration data. 2022-06-22 15:33:59 +08:00
ROY e97d556dd9 [cali] update BOARD_7 calibration data. 2022-06-10 18:19:46 +08:00
ROY c227d21546 [update] use red led when BT timeout 2022-06-01 10:57:35 +08:00
ROY f9e33d0ede [cali] add BOARD_11 calibration data. 2022-05-31 16:13:51 +08:00
ROY a9fd1028d1 [cali] add BOARD_8 calibration data. 2022-05-31 16:08:18 +08:00
ROY f6a20eaea5 [cali] update BOARD_2 calibration data. 2022-05-31 13:26:34 +08:00
ROY f904bbd522 [cali] update BOARD_7 calibration data. 2022-05-31 13:23:55 +08:00
ROY 6f3a1b57ae [cali] add BOARD_7 calibration data. 2022-05-26 17:31:39 +08:00
ROY b795b7eb6b [cali] update BOARD_8 & BOARD_9 & BOARD_10 calibration data. 2022-05-26 17:22:37 +08:00
ROY a1adf82f2b [update] cc & cp corrected speed 1/10/100 2022-05-23 11:00:46 +08:00
Roy 061064c27a [update] don't use GPT_MODE_PERIODIC_DOWN 2022-05-18 15:17:38 +08:00
Roy 2d1556686c [cali] update BOARD_1 calibration data. 2022-05-04 10:40:13 +08:00
Roy 0d7f334499 [cali] update BOARD_4 calibration data. 2022-05-04 10:38:25 +08:00
Roy b849231be3 [update] fix manual current stalls 2022-04-29 18:37:39 +08:00
Roy 060dde64a8 [cali] update BOARD_5 calibration data. 2022-04-29 16:48:21 +08:00
Roy 6be73528d4 [cali] update BOARD_1 calibration data. 2022-04-29 10:12:16 +08:00
Roy 7b4436920f [cali] update BOARD_2 calibration data. 2022-04-28 18:18:26 +08:00
Roy b34e947cc8 [update] fix power off led 2022-04-28 10:15:20 +08:00
Roy 8c4737e494 [cali] add BOARD_6 calibration data. 2022-04-27 16:57:55 +08:00
Roy 6f36e781b7 [cali] add BOARD_5 calibration data. 2022-04-27 16:55:25 +08:00
Roy 8403c16fa0 [update] fix highz problem 2022-04-27 13:18:24 +08:00
50 changed files with 5197 additions and 3863 deletions
+235 -104
View File
@@ -1,185 +1,316 @@
# WTP_cc2650_development
## Device
## Source code path
### Device major source code path
1. Device major source code path
- main code
`E:\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\main.c`
`E:\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\simple_peripheral.c`
`E:\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\headstage\headstage.h`
- gpio table
- main code
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\boards\BOOSTXL_CC2650MA\BOOSTXL_CC2650MA.h`
`E:\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\main.c`
`E:\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\simple_peripheral.c`
`E:\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\headstage\headstage.h`
- gpio table
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\boards\CC2650_LAUNCHXL\CC2650_LAUNCHXL.h`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\boards\BOOSTXL_CC2650MA\BOOSTXL_CC2650MA.h`
- GATT
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\profiles\simple_profile\simple_gatt_profile.h`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\boards\CC2650_LAUNCHXL\CC2650_LAUNCHXL.h`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\profiles\simple_profile\cc26xx\simple_gatt_profile.c`
- GATT
### Memory board major source code path:
- cc2650 host_test
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\profiles\simple_profile\simple_gatt_profile.h`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\profiles\simple_profile\cc26xx\simple_gatt_profile.c`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\host_test\cc26xx\app\host_test_app.c`
2. Memory board major source code path
- cc2650 host_test
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\host_test\cc26xx\app\main.c`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\host_test\cc26xx\app\host_test_app.c`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\host_test\cc26xx\app\main.c`
- cc2650 central
- cc2650 central
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_central\cc26xx\app\main.c`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_central\cc26xx\app\main.c`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_central\cc26xx\app\simple_central.c`
`E:\WT_project_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_central\cc26xx\app\simple_central.c`
* * *
## How to install this project in your PC
### Prerequisite:
- Prerequisite:
anti-virus software might cause some problems, disable it while installing is recommended.
anti-virus software might cause some problems, disable it while installing is recommended.
### Install CCStudio
- Install CCStudio
1. [code composer studio](https://www.ti.com/tool/CCSTUDIO) :
1. [code composer studio](https://www.ti.com/tool/CCSTUDIO) :
choose the latest version (we use Version: 11.1.0.00011 Release date: 20 Dec 2021, Windows single file installer for CCS IDE) of Code Composer Studio.
2. unzip it
2. unzip it
3. open the folder **CCS11.1.0.00011_win64** -> Open sub-folder **CCS11.1.0.00011_win64**
3. open the folder **CCS11.1.0.00011_win64** -> Open sub-folder **CCS11.1.0.00011_win64**
4. run installer **ccs_setup_11.1.0.00011.exe**
4. run installer **ccs_setup_11.1.0.00011.exe**
5. accept the license
5. accept the license
6. install at folder `C:\ti\ccs1110`
6. install at folder `C:\ti\ccs1110`
7. select installation type: Custom installation
7. select installation type: Custom installation
8. select Components: SimpleLink CC13xx and CC26xx Wireless MCUs
8. select Components: SimpleLink CC13xx and CC26xx Wireless MCUs
9. select all Debug Probes
9. select all Debug Probes
10. finish. Wait for the install process......
10. finish. Wait for the install process......
11. select options to create desktop shortcut and launch CCStudio
11. select options to create desktop shortcut and launch CCStudio
12. at the first launch, CCStudio will ask you to select a directory as workspace. use directory `C:\Users\kimwu\workspace_ti` -> Launch
12. at the first launch, CCStudio will ask you to select a directory as workspace. use directory `C:\Users\kimwu\workspace_ti` -> Launch
### install BLE STACK
- Install BLE STACK
1. [BLE STACK](https://www.ti.com/tool/BLE-STACK-ARCHIVE):
1. [BLE STACK](https://www.ti.com/tool/BLE-STACK-ARCHIVE):
choose **BLE-STACK-2-2-2 — BLE-STACK V2.2.2 (Support for CC2640/CC2650)** Free version.
(a TI account is required)
2. run **ble_sdk_2_02_02_25_setup.exe**
2. run **ble_sdk_2_02_02_25_setup.exe**
3. accept the license agreement
3. accept the license agreement
4. install **the BLE-Stack SDK** at the directory `C:\ti\simplelink` -> wait for the install process......
4. install **the BLE-Stack SDK** at the directory `C:\ti\simplelink` -> wait for the install process......
5. **Setup - TI-RTOS for CC13xx and CC26xx Wireless MCUs 2.21.01.08** will jump out -> use installation directory `C:\ti` -> next
5. **Setup - TI-RTOS for CC13xx and CC26xx Wireless MCUs 2.21.01.08** will jump out -> use installation directory `C:\ti` -> next
at the same time, **ble_sdk_2_02_02_25_setup.exe** will still be running, don't close the window
<font color='red'> !!! </font> at the same time, **ble_sdk_2_02_02_25_setup.exe** will still be running, don't close the window
6. wait for the install process......
6. wait for the install process......
7. finish
7. finish
### First run CCStudio and setting
- First run CCStudio and setting
1. start CCStudio, Use the default.`C:\Users\kimwu\workspace_ti` -> Launch
1. start CCStudio, Use the default. `C:\Users\kimwu\workspace_ti`
2. Project -> Import CCS Projects -> Select search-directory `C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral` -> OK -> select all discovered projects -> finish
-> Launch
4. right click `simple_peripheral_cc2650em_app` -> Properties -> General -> Products -> double click **com.ti.rtsc.TIRTOSCC13XX_CC26XX [2.21.1.08]** -> Preferences -> refresh -> select ```"C:\ti\tirtos_cc13xx_cc26xx_2_21_01_08"``` and ```"C:\ti\xdctools_3_32_00_06_core"``` -> Install -> restart CCS
5. right click `simple_peripheral_cc2650em_app` -> Properties -> General -> Project: Compiler version -> Tool-chain: **Compiler version: TI v20.2.5LTS** -> apply amd close
2. Project
6. right click `simple_peripheral_cc2650em_stack` -> Properties -> General -> Project: Compiler version -> Tool-chain: **Compiler version: TI v20.2.5LTS** -> apply amd close
-> Import CCS Projects
7. click `simple_peripheral_cc2650em_app`, Click *build* and it's done
8. click `simple_peripheral_cc2650em_stack` Click *build* and it has error: "C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/osal/src/common/osal.c", line 408: error #167: too few arguments in function call
modify code: osal.c line:408
return ( (unsigned char*)ltoa( l, (char *)buf) ); -> return ( (unsigned char*)ltoa( l, (char *)buf, radix) );
and then, click *build* and it's done
-> Select search-directory `C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral`
-> OK
-> select all discovered projects
-> finish
### clone this project
#### with Command line interface (git-bash)
1. clone our project to E:\MCU_code\.
3. right click `simple_peripheral_cc2650em_app`
`git clone [WTP_cc2650_development URL]`, where URL is our project url on gitlab.
2. copy `E:\MCU_code\wtp_cc2650_development\backup\examples` to `E:\MCU_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25`
-> Properties
-> General
-> Products
-> double click **com.ti.rtsc.TIRTOSCC13XX_CC26XX [2.21.1.08]**
-> Preferences
-> refresh
-> select `"C:\ti\tirtos_cc13xx_cc26xx_2_21_01_08"` and `"C:\ti\xdctools_3_32_00_06_core"`
-> Install
-> restart CCS
terminal:
$cd /e/MCU_code/wtp_cc2650_development
$cp -r ./backup/examples ./simplelink/ble_sdk_2_02_02_25/
4. right click `simple_peripheral_cc2650em_app`
-> Properties
-> General
-> Project
-> Tool-chain: **Compiler version: TI v20.2.5LTS**
Device: **Connection: Texas Instrument XDS110 USB Debug Probe[Default]**
-> apply amd close
5. click `simple_peripheral_cc2650em_app`, Click *build* and it's done
6. right click `simple_peripheral_cc2650em_stack`
-> Properties
-> General
-> Project: Compiler version
-> Tool-chain: **Compiler version: TI v20.2.5LTS**
Device: **Connection: Texas Instrument XDS110 USB Debug Probe[Default]**
-> apply amd close
### select project at CCS
1. start CCStudio, Use the directory.`C:\Users\kimwu\workspace_ti_wtp_cc2650_development` -> Launch
2. Project -> Import CCS Projects -> Select search-directory `E:\MCU_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral` -> OK
3. select all discovered projects -> finish
4. right click `simple_peripheral_cc2650em_app` -> Properties -> Build-> Arm Compiler -> Include Options
-> change `"D:\MCU_code\wtp_cc2650_simple_func\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\headstage"`
to `"E:\MCU_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\headstage"`
-> Apply and Close
7. click `simple_peripheral_cc2650em_stack` Click *build* and it has error: "C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/osal/src/common/osal.c", line 408: error #167: too few arguments in function call
8. modify code: osal.c line:408
```c
return ( (unsigned char*)ltoa( l, (char *)buf) );
```
change to
```c
return ( (unsigned char*)ltoa( l, (char *)buf, radix) );
```
9. and then, click *build* and it's done
- Clone this project(with Command line interface `git-bash`)
1. clone our project to E:\MCU_code\.
`git clone [WTP_cc2650_development URL]`, where URL is our project url on gitlab.
2. copy `E:\MCU_code\wtp_cc2650_development\backup\examples` to `E:\MCU_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25`
```linux
terminal:
$cd /e/MCU_code/wtp_cc2650_development
$cp -r ./backup/examples ./simplelink/ble_sdk_2_02_02_25/
```
- select project at CCS
1. start CCStudio, Use the directory.
`C:\Users\kimwu\workspace_ti_wtp_cc2650_development`
-> Launch
2. 先設置 device compiler 環境
- switch branch to elite/edc1.5re
```linux
terminal:
$git checkout elite/edc1.5re
```
- Project
-> Import CCS Projects
-> Select search-directory `E:\MCU_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral`
-> OK
- select all discovered projects
-> finish
- right click `simple_peripheral_cc2650em_app`
-> Properties
-> Build-> Arm Compiler
-> Include Options
-> change `"D:\MCU_code\wtp_cc2650_simple_func\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\headstage"`
to `"${SRC_EX}/examples/simple_peripheral/cc26xx/app/headstage"`
-> Apply and Close
- and then, click *build* and it's done
3. 再設置 memory board compiler 環境
- switch branch to rel/mb/central/v1.7.0
```linux
terminal:
$git checkout rel/mb/central/v1.7.0
```
- Project -> Import CCS Projects
-> Select search-directory `E:\MCU_code\wtp_cc2650_development\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_central`
-> OK
- select all discovered projects
-> finish
- right click `simple_central_cc2650em_app`
-> Properties
-> Build
-> Arm Compiler
-> Advanced Options
-> Predefined Symbols
-> add "MODA_MEMORY_BOARD" 、 "BOOSTXL_CC2650MA"
-> remove "CC2650DK_7ID"
-> Apply and Close
- and then, click *build* and it's done
* * *
### Optional
#### install git if you don't install it
- install git if you don't install it
- https://git-scm.com/download/win
- https://git-scm.com/download/win
- choose corresponding version for your computer from 'Git for Windows Setup'
- choose corresponding version for your computer from 'Git for Windows Setup'
#### doxygen: tool to help documenting code
- doxygen: tool to help documenting code
- download from main page http://www.doxygen.nl/download.html
- download from main page http://www.doxygen.nl/download.html
- according to different OS, download corresponding version.
- according to different OS, download corresponding version.
- press keyboard 'ctrl' + 'shift' + 'a' to search external tool, select 'external tools-setting'
- press keyboard 'ctrl' + 'shift' + 'a' to search external tool, select 'external tools-setting'
- add external tool by pressing '+'
- add external tool by pressing '+'
- name this external tool in the column 'name'
- name this external tool in the column 'name'
- set the path of doxygen execute file in the column 'program'
- set the path of doxygen execute file in the column 'program'
- set the repository we want to generate document automatically in the column 'working directory'
- set the repository we want to generate document automatically in the column 'working directory'
- set hotkey of doxygen to run : 'File' -> 'Setting' -> 'Keymap' -> 'external tools'
- set hotkey of doxygen to run : 'File' -> 'Setting' -> 'Keymap' -> 'external tools'
- press the hotkey to run doxygen
- press the hotkey to run doxygen
### Troubleshooting
- Troubleshooting
- jump a dialog with **MSVC components failed to install.
Please install executables manually from c:/ti/ccsv8/installers before using CCS**
- jump a dialog with **MSVC components failed to install.
Please install executables manually from c:/ti/ccsv8/installers before using CCS**
ignore it.
ignore it.
- jumps a warning dialog of Windows Defender
- jumps a warning dialog of Windows Defender
Allow the network access.
@@ -193,49 +193,63 @@ const UDMACC26XX_Config UDMACC26XX_config[] = {
* ========================== SPI DMA begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
// #if defined(__TI_COMPILER_VERSION__)
// #pragma DATA_SECTION(SPI_config, ".const:SPI_config")
// #pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs")
// #endif
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs")
#endif
// /* Include drivers */
// #include <ti/drivers/spi/SPICC26XXDMA.h>
/* Include drivers */
#include <ti/drivers/spi/SPICC26XXDMA.h>
// /* SPI objects */
// SPICC26XXDMA_Object spiCC26XXDMAObjects[BOOSTXL_CC2650MA_SPICOUNT];
/* SPI objects */
SPICC26XXDMA_Object spiCC26XXDMAObjects[BOOSTXL_CC2650MA_SPICOUNT];
// /* SPI configuration structure, describing which pins are to be used */
// const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[BOOSTXL_CC2650MA_UDMACOUNT] = {
// {
// .baseAddr = SSI0_BASE,
// .intNum = INT_SSI0_COMB,
// .intPriority = ~0,
// .swiPriority = 0,
// .powerMngrId = PowerCC26XX_PERIPH_SSI0,
// .defaultTxBufValue = 0,
// .rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
// .txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
// .mosiPin = Board_SPI0_MOSI,
// .misoPin = Board_SPI0_MISO,
// .clkPin = Board_SPI0_CLK,
// .csnPin = Board_SPI0_CS
// },
// };
/* SPI configuration structure, describing which pins are to be used */
const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[BOOSTXL_CC2650MA_SPICOUNT] = {
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.mosiPin = Board_SPI0_MOSI,
.misoPin = Board_SPI0_MISO,
.clkPin = Board_SPI0_CLK,
.csnPin = Board_SPI0_CS
},
{
.baseAddr = SSI1_BASE,
.intNum = INT_SSI1_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI1,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX,
.mosiPin = Board_SPI1_MOSI,
.misoPin = Board_SPI1_MISO,
.clkPin = Board_SPI1_CLK,
.csnPin = Board_SPI1_CS
},
};
// /* SPI configuration structure */
// const SPI_Config SPI_config[] = {
// {
// .fxnTablePtr = &SPICC26XXDMA_fxnTable,
// .object = &spiCC26XXDMAObjects[0],
// .hwAttrs = &spiCC26XXDMAHWAttrs[0]
// },
// {
// .fxnTablePtr = &SPICC26XXDMA_fxnTable,
// .object = &spiCC26XXDMAObjects[1],
// .hwAttrs = &spiCC26XXDMAHWAttrs[1]
// },
// {NULL, NULL, NULL}
// };
/* SPI configuration structure */
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[0],
.hwAttrs = &spiCC26XXDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[1],
.hwAttrs = &spiCC26XXDMAHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ========================== SPI DMA end =====================================
*/
@@ -423,3 +437,44 @@ const PWM_Config PWM_config[BOOSTXL_CC2650MA_PWMCOUNT + 1] = {
/*
* ============================= PWM end ======================================
*/
/*
* ============================= I2C Begin=====================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(I2C_config, ".const:I2C_config")
#pragma DATA_SECTION(i2cCC26xxHWAttrs, ".const:i2cCC26xxHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/i2c/I2CCC26XX.h>
/* I2C objects */
I2CCC26XX_Object i2cCC26xxObjects[BOOSTXL_CC2650MA_I2CCOUNT];
/* I2C configuration structure, describing which pins are to be used */
const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[BOOSTXL_CC2650MA_I2CCOUNT] = {
{
.baseAddr = I2C0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_I2C0,
.intNum = INT_I2C_IRQ,
.intPriority = ~0,
.swiPriority = 0,
.sdaPin = Board_I2C0_SDA0,
.sclPin = Board_I2C0_SCL0,
}
};
/* I2C configuration structure */
const I2C_Config I2C_config[] = {
{
.fxnTablePtr = &I2CCC26XX_fxnTable,
.object = &i2cCC26xxObjects[0],
.hwAttrs = &i2cCC26xxHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ========================== I2C end =========================================
*/
@@ -50,6 +50,7 @@ extern "C" {
* ==========================================================================*/
#include <ti/drivers/PIN.h>
#include <driverlib/ioc.h>
#include "boards_config/elite_boards_select.h"
/** ============================================================================
* Externs
@@ -171,6 +172,8 @@ extern const PIN_Config BoardGpioInitTable[];
/* Generic SPI instance identifiers */
#define Board_SPI0 BOOSTXL_CC2650MA_SPI0
#define Board_SPI1 BOOSTXL_CC2650MA_SPI1
/* Generic I2C instance identifiers */
#define Board_I2C0 BOOSTXL_CC2650MA_I2C0
/* Generic UART instance identifiers */
#define Board_UART BOOSTXL_CC2650MA_UART0
/* Generic TRNG instance identiifer */
@@ -209,15 +212,16 @@ typedef enum BOOSTXL_CC2650MA_CryptoName {
} BOOSTXL_CC2650MA_CryptoName;
// /*!
// * @def BOOSTXL_CC2650MA_SPIName
// * @brief Enum of SPI names on the CC2650 Booster Pack
// */
// typedef enum BOOSTXL_CC2650MA_SPIName {
// BOOSTXL_CC2650MA_SPI0 = 0,
/*!
* @def BOOSTXL_CC2650MA_SPIName
* @brief Enum of SPI names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_SPIName {
BOOSTXL_CC2650MA_SPI0 = 0,
BOOSTXL_CC2650MA_SPI1 = 1,
// BOOSTXL_CC2650MA_SPICOUNT
// } BOOSTXL_CC2650MA_SPIName;
BOOSTXL_CC2650MA_SPICOUNT
} BOOSTXL_CC2650MA_SPIName;
/*!
* @def BOOSTXL_CC2650MA_TRNGName
@@ -295,6 +299,16 @@ typedef enum BOOSTXL_CC2650MA_PWM
BOOSTXL_CC2650MA_PWMCOUNT
} BOOSTXL_CC2650MA_PWM;
/*!
* @def BOOSTXL_CC2650MA_I2CName
* @brief Enum of I2C names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_I2CName {
BOOSTXL_CC2650MA_I2C0 = 0,
BOOSTXL_CC2650MA_I2CCOUNT
} BOOSTXL_CC2650MA_I2CName;
#ifdef __cplusplus
}
#endif
@@ -60,6 +60,7 @@ extern "C" {
#define Board_initGPIO()
#define Board_initPWM() PWM_init()
#define Board_initSPI() SPI_init()
#define Board_initI2C() I2C_init()
#define Board_initUART() UART_init()
#define Board_initWatchdog() Watchdog_init()
#define GPIO_toggle(n)
@@ -0,0 +1,141 @@
#ifndef ELITE_BOARDS_SELECT_H
#define ELITE_BOARDS_SELECT_H
#ifdef __cplusplus
extern "C" {
#endif
/*
*
* product number: MAJOR_PRODUCT_NUMBER, MINOR_PRODUCT_NUMBER, MAJOR_VERSION_NUMBER, MINOR_VERSION_NUMBER
* MAJOR_PRODUCT_NUMBER -> 0:Elite, 1:other serial
* Elite:
* MINOR_PRODUCT_NUMBER -> 1:legacy, 2:EDC, 3:BAT, 4:EIS, 5:TRIG, 6:MEGAFLY
*
* +------------------------+----------------------+-------------------------+----------------+----------------------+----------------------+----------+
* | model name | hw upper board | hw lower board | product number | device name | data server lib name | UI |
* +------------------------+----------------------+-------------------------+----------------+----------------------+----------------------+----------+
* | DEF_ELITE_EDC_14 | Elite1.4-re Jun.2019 | Elite1.4-re Jun. 2019 | 0, 2, 1, 5 | "Elite-EDC" | Elite_EDC_1.4 | null |
* | DEF_ELITE_EDC_15 | Elite1.5 Dec. 2019 | Elite1.5 Dec. 2019 | 0, 2, 1, 6 | "Elite-EDC" | Elite_EDC_1.5 | EliteEDC |
* | DEF_ELITE_EDC_15RE | Elite1.5 Dec. 2019 | Elite1.5-re Jan. 2021 | 0, 2, 1, 7 | "Elite-EDC" | Elite_EDC_1.5re | EliteEDC |
* | DEF_ELITE_EDC_15R2 | Elite1.5 Dec. 2019 | Elite1.5-r2 May. 2022 | 0, 2, 1, 8 | "Elite-EDC" | Elite_EDC_1.5r2 | EliteEDC |
* | DEF_ELITE_BAT_10 | Elite2.0 Feb. 2022 | 0, 3, 1, 0 | "Elite-BAT" | Elite_BAT_1.0 | EliteEDC |
* | DEF_ELITE_EIS_10 | Elite1.5 Dec. 2019 | Elite EIS1.0 Aug. 2020 | 0, 4, 1, 0 | "Elite-EIS" | Elite_EIS_1.0 | EliteEIS |
* | DEF_ELITE_EIS_11 | Elite1.5 Dec. 2019 | Elite EIS1.1 Feb. 2022 | 0, 4, 1, 1 | "Elite-EIS" | Elite_EIS_1.1 | EliteEIS |
* | DEF_ELITE_EIS_MINI_10 | EIS MINI May. 2022 | 0, 4, 1, 2 | "Elite-EIS-MINI" | Elite_EIS_MINI_1.0 | EliteEIS |
* | DEF_ELITE_TRIG_01 | Elite TRIG01 Jan. 2021 | 0, 5, 1, 0 | "Elite-TRIG" | Elite_TRIG_0.1 | null |
* | DEF_ELITE_MEGAFLY_01 | Elite1.5 Dec. 2019 | Elite Megafly Sep. 2020 | 0, 6, 1, 0 | "Elite-MEGAFLY" | Elite_MEGAFLY_0.1 | null |
* +------------------------+----------------------+-------------------------+----------------+----------------------+----------------------+----------+
* ps.
* model name is FW engineer defined
* device name is used for controller
*/
#define DEF_ELITE_EDC_14 0
#define DEF_ELITE_EDC_15 1
#define DEF_ELITE_EDC_15RE 2
#define DEF_ELITE_EDC_15R2 3
#define DEF_ELITE_BAT_10 4
#define DEF_ELITE_EIS_10 5
#define DEF_ELITE_EIS_11 6
#define DEF_ELITE_EIS_MINI_10 7
#define DEF_ELITE_TRIG_01 8
#define DEF_ELITE_MEGAFLY_01 9
#define DEF_ELITE_MAX 10
#define DEF_ELITE_MODEL DEF_ELITE_EDC_15RE
#ifndef DEF_ELITE_MODEL
#error "DEF_ELITE_MODEL not defined"
#endif
#if (DEF_ELITE_MODEL == DEF_ELITE_EDC_14)
#error "code no support" // need fix
#elif (DEF_ELITE_MODEL == DEF_ELITE_EDC_15)
#error "code no support" // need fix
#elif (DEF_ELITE_MODEL == DEF_ELITE_EDC_15RE)
#include "boards_config/pin_def_edc15re.h"
#elif (DEF_ELITE_MODEL == DEF_ELITE_EDC_15R2)
#error "code no support" // need fix
#elif (DEF_ELITE_MODEL == DEF_ELITE_EIS_10)
#error "code no support" // need fix
#elif (DEF_ELITE_MODEL == DEF_ELITE_EIS_11)
#include "boards_config/pin_def_eis11.h"
#elif (DEF_ELITE_MODEL == DEF_ELITE_BAT_10)
#error "code no support" // need fix
#elif (DEF_ELITE_MODEL == DEF_ELITE_MEGAFLY_01)
#error "code no support" // need fix
#elif (DEF_ELITE_MODEL == DEF_ELITE_TRIG_01)
#error "code no support" // need fix
#else
#error "no this model"
#endif
// model information
#if (DEF_ELITE_MODEL == DEF_ELITE_EDC_14)
#define DEVICE_NAME "Elite-EDC"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 2
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 5
#elif (DEF_ELITE_MODEL == DEF_ELITE_EDC_15)
#define DEVICE_NAME "Elite-EDC"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 2
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 6
#elif (DEF_ELITE_MODEL == DEF_ELITE_EDC_15RE)
#define DEVICE_NAME "Elite-EDC"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 2
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 7
#elif (DEF_ELITE_MODEL == DEF_ELITE_EDC_15R2)
#define DEVICE_NAME "Elite-EDC"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 2
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 8
#elif (DEF_ELITE_MODEL == DEF_ELITE_BAT_10)
#define DEVICE_NAME "Elite-BAT"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 3
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 0
#elif (DEF_ELITE_MODEL == DEF_ELITE_EIS_10)
#define DEVICE_NAME "Elite-EIS"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 4
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 0
#elif (DEF_ELITE_MODEL == DEF_ELITE_EIS_11)
#define DEVICE_NAME "Elite-EIS"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 4
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 1
#elif (DEF_ELITE_MODEL == DEF_ELITE_EIS_MINI_10)
#define DEVICE_NAME "Elite-EIS"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 4
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 2
#elif (DEF_ELITE_MODEL == DEF_ELITE_TRIG_01)
#define DEVICE_NAME "Elite-TRIG"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 5
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 0
#elif (DEF_ELITE_MODEL == DEF_ELITE_MEGAFLY_01)
#define DEVICE_NAME "Elite-MEGAFLY"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 6
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 0
#endif
#ifdef __cplusplus
}
#endif
#endif // ELITE_BOARDS_SELECT_H
@@ -0,0 +1,63 @@
#ifndef PIN_DEF_EDC15RE_H
#define PIN_DEF_EDC15RE_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* +------------------------------+
* | CC2650moda |
* +-------------+----------------+
* | MISO | DIO1 |
* | D0 | DIO3 |
* | D1 | DIO4 |
* | D2/JTAG_TDO | DIO5/JTAG_TDO |
* | D3/JTAG_TDI | DIO6/JTAG_TDI |
* | D4 | DIO7 |
* | D5 | DIO8 |
* | D6 | DIO9 |
* | D7 | DIO10 |
* | LOAD2 | DIO11 |
* | LOAD1 | DIO12 |
* | LOAD0 | DIO13 |
* | SHUT_DOWN | DIO14 |
* +-------------+----------------+
*/
/* CC2650moda */
#define E_PIN_MISO DIO1
#define E_PIN_D0 DIO3
#define E_PIN_D1 DIO4
#define E_PIN_D2 DIO5
#define E_PIN_D3 DIO6
#define E_PIN_D4 DIO7
#define E_PIN_D5 DIO8
#define E_PIN_D6 DIO9
#define E_PIN_D7 DIO10
#define E_PIN_LOAD2 DIO11
#define E_PIN_LOAD1 DIO12
#define E_PIN_LOAD0 DIO13
#define E_PIN_SHUT_DOWN DIO14 // to sense switch
/* SPI Board */
#define Board_SPI0_MISO PIN_UNASSIGNED
#define Board_SPI0_MOSI E_PIN_D1
#define Board_SPI0_CLK E_PIN_D0
#define Board_SPI0_CS PIN_UNASSIGNED
#define Board_SPI1_MISO E_PIN_MISO
#define Board_SPI1_MOSI E_PIN_D3
#define Board_SPI1_CLK E_PIN_D2
#define Board_SPI1_CS PIN_UNASSIGNED
/* I2C */
#define Board_I2C0_SCL0 PIN_UNASSIGNED
#define Board_I2C0_SDA0 PIN_UNASSIGNED
#ifdef __cplusplus
}
#endif
#endif // PIN_DEF_EDC15RE_H
@@ -0,0 +1,15 @@
#ifndef GPIO_EDC15RE_H
#define GPIO_EDC15RE_H
#ifdef __cplusplus
extern "C" {
#endif
uint8_t gpio_create(void);
uint8_t add_pin_d0_d3(void);
uint8_t remove_pin_d0_d3(void);
#ifdef __cplusplus
}
#endif
#endif // GPIO_EDC15RE_H
@@ -0,0 +1,89 @@
#include <Board.h>
#include <ti/drivers/pin/PINCC26XX.h>
#include "driver/gpio_edc15re.h"
static PIN_Handle PinHandle;
static PIN_State PinStatus;
const PIN_Config BLE_IO[] = {
E_PIN_D0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D5 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D6 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_D7 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_LOAD0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_LOAD1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_LOAD2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
E_PIN_SHUT_DOWN | PIN_INPUT_EN | PIN_PULLDOWN,
PIN_TERMINATE
};
static PIN_Handle __get_gpio_handle(void)
{
return PinHandle;
}
static void __set_gpio_handle(PIN_Handle handle)
{
PinHandle = handle;
return;
}
uint8_t gpio_create(void)
{
PIN_Handle h;
h = PIN_open(&PinStatus, BLE_IO);
__set_gpio_handle(h);
if (h == NULL)
return 1;
return 0;
}
uint8_t add_pin_d0_d3(void)
{
PIN_Handle h = __get_gpio_handle();
PIN_add(h, E_PIN_D0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
PIN_add(h, E_PIN_D1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
PIN_add(h, E_PIN_D2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
PIN_add(h, E_PIN_D3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
return 0;
}
uint8_t remove_pin_d0_d3(void)
{
PIN_Handle h = __get_gpio_handle();
PIN_remove(h, E_PIN_D0);
PIN_remove(h, E_PIN_D1);
PIN_remove(h, E_PIN_D2);
PIN_remove(h, E_PIN_D3);
return 0;
}
static uint8_t pin_set(uint8_t pin, uint8_t set_value)
{
/*
* if status = 0: success
* else: fail
*/
uint8_t p = pin;
uint8_t v = set_value;
PIN_Status status;
PIN_Handle h = __get_gpio_handle();
status = PIN_setOutputValue(h, p, v);
return (uint8_t)status;
}
@@ -0,0 +1,26 @@
#ifndef SPI_CTRL_H
#define SPI_CTRL_H
#ifdef __cplusplus
extern "C" {
#endif
#define SPI0 0
#define SPI1 1
#define SPI_POL0 0
#define SPI_POL1 1
#define SPI_PHA0 0
#define SPI_PHA1 1
#define SPI_RATE_1M 1000000
#define SPI_RATE_4M 4000000
#define SPI_RATE_6M 6000000
uint8_t spi_open(uint8_t spi_n, uint32_t b_rate, uint8_t pol, uint8_t pha);
uint8_t spi_close(uint8_t spi_n);
uint8_t spi_write(uint8_t spi_n, uint8_t *rxBuf, uint8_t *txBuf, uint8_t len);
#ifdef __cplusplus
}
#endif
#endif // SPI_CTRL_H
@@ -0,0 +1,173 @@
#include <Board.h>
#include <ti/drivers/SPI.h>
#include "driver/spi_ctrl.h"
#define CC2650_SPI_BITRATE_MAX 6e6 //Full-duplex maximum speed = 6M
static SPI_Handle SpiHandle0 = NULL;
static SPI_Params SpiParams0;
static SPI_Handle SpiHandle1 = NULL;
static SPI_Params SpiParams1;
/**
* _get_spi_mode - transfer both polarity and phase to pol_pha_combine
* @pol: polarity
* @pha: phase
* Returns: spi mode
*/
static SPI_FrameFormat _get_spi_mode(uint8_t pol, uint8_t pha)
{
SPI_FrameFormat spi_mode;
if (pol == 0 && pha == 0)
spi_mode = SPI_POL0_PHA0;
else if (pol == 0 && pha == 1)
spi_mode = SPI_POL0_PHA1;
else if (pol == 1 && pha == 0)
spi_mode = SPI_POL1_PHA0;
else if (pol == 1 && pha == 1)
spi_mode = SPI_POL1_PHA1;
return spi_mode;
}
/**
* spi_open -
* @spi_n: which SPI
* @b_rate: bit rate of SPI
* @pol: polarity
* @pha: phase
* Returns: 0 on success, 1 on no this spi module, 2 on unsupported bit rate,
* 3 on unsupported polarity and phase, 4 on spi already open,
* 5 on failure
* note: Before using PIN_open() and SPI_open(), make sure that the pins are \
* not already registered, otherwise it will crash.
*/
uint8_t spi_open(uint8_t spi_n, uint32_t b_rate, uint8_t pol, uint8_t pha)
{
SPI_Handle* h;
SPI_Params* para;
uint8_t spi_module;
if (spi_n >= 2)
return 1;
if (b_rate > CC2650_SPI_BITRATE_MAX)
return 2;
if (pol > 1 || pha > 1)
return 3;
if (spi_n == SPI0)
{
h = &SpiHandle0;
para = &SpiParams0;
spi_module = Board_SPI0;
}
else
{
h = &SpiHandle1;
para = &SpiParams1;
spi_module = Board_SPI1;
}
if (*h != NULL)
return 4;
SPI_Params_init(para);
para->bitRate = b_rate;
para->mode = SPI_MASTER;
para->dataSize = 8;
para->frameFormat = _get_spi_mode(pol, pha);
*h = SPI_open(spi_module, para);
if (*h == NULL)
return 5;
return 0;
}
/**
* spi_close -
* @spi_n: which SPI
* Returns: 0 on success, 1 on no this spi module, 2 on no instance
* note: Before using PIN_close() and SPI_close(), make sure that there is \
* an instance available, otherwise it will crash.
*/
uint8_t spi_close(uint8_t spi_n)
{
SPI_Handle *h;
if (spi_n >= 2)
return 1;
if (spi_n == SPI0)
h = &SpiHandle0;
else
h = &SpiHandle1;
if (*h == NULL)
return 2;
SPI_close(*h);
*h = NULL;
return 0;
}
/**
* spi_close -
* @spi_n: which SPI
* @*rxBuf: rxbuf
* @*txBuf: txbuf
* @len: what is the required length
* Returns: 0 on success, 1 on no this spi module, 2 on no instance,
* 3 on write failure
*/
uint8_t spi_write(uint8_t spi_n, uint8_t *rxBuf, uint8_t *txBuf, uint8_t len)
{
uint8_t ret;
SPI_Handle* h;
SPI_Transaction spi_tran;
if (spi_n >= 2)
return 1;
if (spi_n == SPI0)
h = &SpiHandle0;
else
h = &SpiHandle1;
if (*h == NULL)
return 2;
spi_tran.count = len;
spi_tran.txBuf = txBuf;
spi_tran.arg = NULL;
spi_tran.rxBuf = NULL;
ret = SPI_transfer(*h, &spi_tran) ? 0 : 3;
return ret;
}
/* utils.c.h */
/*
#include <stdio.h>
#include <stdint.h>
static void ___print_hex(uint8_t* p, int len)
{
// ___print_hex((uint8_t *)p, sizeof(struct led_series_data_t));
int i;
for (i = 0; i < len; i++) {
printf("0x%x, ", *p++);
}
printf("\n\n");
return;
}
*/
@@ -0,0 +1,40 @@
#ifndef TIMERS_H
#define TIMERS_H
#ifdef __cplusplus
extern "C" {
#endif
//timer
enum gptimer0_ctrl_e {
GPT_CTRL_START = 0,
GPT_CTRL_STOP,
GPT_CTRL_CLOSE,
GPT_CTRL_MAX,
};
void elite_gptimer_open();
uint8_t gptimer0_ctrl(enum gptimer0_ctrl_e gpt_ctrl);
//clock
/***************************************************
* Q: Why define CPU_1us = 16?
* A:
* 3 cycles per loop: 16 loops @ 48 Mhz ~= 1 us
* 3 cycles * X loops / 48Mhz = 1us(ideal value)
* 3 cycles * X loops / 48us = 1us(ideal value)
* X = 48 / 3 => X = 16 loops
***************************************************/
#define CPU_1us 16
#define CPU_1ms 16000
void CPUdelay_us(uint32_t delay_t);
void CPUdelay_ms(uint32_t delay_t);
void GPT_timerIncrement();
#ifdef __cplusplus
}
#endif
#endif // TIMERS_H
@@ -0,0 +1,90 @@
#include <Board.h>
#include <ti/drivers/timer/GPTimerCC26XX.h>
#include <xdc/runtime/Types.h>
#include <ti/sysbios/BIOS.h>
#include "driver/timers.h"
#include "simple_peripheral.h"
static GPTimerCC26XX_Handle gptimer_handle; // was defined static
#define CLOCK_FREQ 4769 // clock freq = 0.1 ms(4800), Measured(4769)
static void elite_gptimer_callback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask) {
elite_gptimer_task();
return;
}
void elite_gptimer_open()
{
GPTimerCC26XX_Params params;
GPTimerCC26XX_Params_init(&params);
params.width = GPT_CONFIG_16BIT;
params.mode = GPT_MODE_PERIODIC_UP;
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
gptimer_handle = GPTimerCC26XX_open(Board_GPTIMER0A, &params);
if (gptimer_handle == NULL) {
Task_exit();
}
Types_FreqHz freq;
BIOS_getCpuFreq(&freq);
GPTimerCC26XX_Value loadVal = freq.lo / 1000 - 1; //47999 = 1ms
loadVal = CLOCK_FREQ; //0.1ms
GPTimerCC26XX_setLoadValue(gptimer_handle, loadVal);
GPTimerCC26XX_registerInterrupt(gptimer_handle, elite_gptimer_callback, GPT_INT_TIMEOUT);
GPTimerCC26XX_start(gptimer_handle);
return;
}
uint8_t gptimer0_ctrl(enum gptimer0_ctrl_e gpt_ctrl)
{
enum gptimer0_ctrl_e gc = gpt_ctrl;
if (gc > GPT_CTRL_MAX)
return 1;
switch (gc) {
case GPT_CTRL_START:
GPTimerCC26XX_start(gptimer_handle);
break;
case GPT_CTRL_STOP:
GPTimerCC26XX_stop(gptimer_handle);
break;
case GPT_CTRL_CLOSE:
GPTimerCC26XX_close(gptimer_handle);
break;
}
return 0;
}
/*******************************************************************************************/
//clock
void CPUdelay_us(uint32_t delay_t)
{
uint32_t t = delay_t;
CPUdelay(t * CPU_1us);
return;
}
void CPUdelay_ms(uint32_t delay_t)
{
uint32_t t = delay_t;
CPUdelay(t * CPU_1ms);
return;
}
void GPT_timerIncrement() {
GPT.cnt_gpt_delta = GPT.cnt_gpt - GPT.cnt_gpt0;
GPT.cnt_gpt0 = GPT.cnt_gpt;
}
@@ -0,0 +1,26 @@
#ifndef ELITE_GPTIMER_H
#define ELITE_GPTIMER_H
#ifdef __cplusplus
extern "C" {
#endif
struct gptimer0_t{
uint32_t cnt_gpt;
uint32_t cnt_gpt0;
uint8_t cnt_gpt_delta;
uint32_t cnt_adc_rate;
uint32_t cnt_notify_rate;
uint32_t cnt_v_scan_rate;
uint32_t cnt_lead_time;
uint32_t BatteryADCCounter;
uint32_t BatteryCheckCounter;
uint32_t GptimerMultiple;
};
void InitGPT();
#ifdef __cplusplus
}
#endif
#endif // ELITE_GPTIMER_H
@@ -0,0 +1,16 @@
#include "elite_task/elite_GPtimer.h"
void InitGPT()
{
GPT.cnt_gpt = 0;
GPT.cnt_gpt0 = 0;
GPT.cnt_gpt_delta = 0;
GPT.cnt_adc_rate = 0;
GPT.cnt_notify_rate = 0;
GPT.cnt_v_scan_rate = 0;
GPT.cnt_lead_time = 0;
GPT.BatteryADCCounter = 0;
GPT.BatteryCheckCounter = 0;
return;
}
@@ -0,0 +1,56 @@
#ifndef ELITE_LATCH_H
#define ELITE_LATCH_H
#ifdef __cplusplus
extern "C" {
#endif
#define LOAD0 0
#define LOAD1 1
#define LOAD2 2
#define LOAD_MAX 3
#define D0 0
#define D1 1
#define D2 2
#define D3 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
#define D_MAX 8
// latch 1 control
// #define E_LATCH_LED_SCLK_A LOAD0, D0 // not gpio
// #define E_LATCH_LED_MOSI_A LOAD0, D1 // not gpio
// #define E_LATCH_SCLK LOAD0, D2 // not gpio
// #define E_LATCH_MOSI LOAD0, D3 // not gpio
#define E_LATCH_HIGH_Z LOAD0, D4
#define E_LATCH_CS_MEM LOAD0, D5
#define E_LATCH_CS_ADC LOAD0, D6
#define E_LATCH_CS_DAC LOAD0, D7
// latch 2 control
#define E_LATCH_MEM_HOLD LOAD1, D0
#define E_LATCH_10V_ENABLE LOAD1, D5
#define E_LATCH_5V_ENABLE LOAD1, D6
// latch 3 control
#define E_LATCH_I_MID_ON LOAD2, D0
#define E_LATCH_I_LARGE_ON LOAD2, D1
#define E_LATCH_V_SMALL_ON LOAD2, D2
#define E_LATCH_V_MID_ON LOAD2, D3
#define E_LATCH_I_SMALL_ON LOAD2, D4
#define E_LATCH_OFF LOAD2, D6
#define E_LATCH_VOUT_SMALL_ON LOAD2, D7
#define HIGH_Z_OPEN() latch_single_ctrl(E_LATCH_HIGH_Z, 0);
#define HIGH_Z_CLOSE() latch_single_ctrl(E_LATCH_HIGH_Z, 1);
uint8_t update_latch_stat(uint8_t latch, uint8_t dio, uint8_t value);
uint8_t latch_single_ctrl(uint8_t latch, uint8_t dio, uint8_t value);
uint8_t latch_multi_ctrl(void);
#ifdef __cplusplus
}
#endif
#endif // ELITE_LATCH_H
@@ -0,0 +1,352 @@
#include "elite_task/elite_latch.h"
#include "driver/gpio_edc15re.h"
#include "driver/spi_ctrl.h"
enum pin_ctrl_e {
PC_LOAD0_CLR = 0,
PC_LOAD0_SET,
PC_LOAD1_CLR,
PC_LOAD1_SET,
PC_LOAD2_CLR,
PC_LOAD2_SET,
PC_D0_CLR,
PC_D0_SET,
PC_D1_CLR,
PC_D1_SET,
PC_D2_CLR,
PC_D2_SET,
PC_D3_CLR,
PC_D3_SET,
PC_D4_CLR,
PC_D4_SET,
PC_D5_CLR,
PC_D5_SET,
PC_D6_CLR,
PC_D6_SET,
PC_D7_CLR,
PC_D7_SET,
PC_MAX,
};
//d0.d1.d2.d3.d4.d5.d6.d7
struct latch_t {
uint8_t d7: 1,
d6: 1,
d5: 1,
d4: 1,
d3: 1,
d2: 1,
d1: 1,
d0: 1;
};
static struct latch_t LH0 = {0};
static struct latch_t LH1 = {0};
static struct latch_t LH2 = {0};
static uint8_t __pin_ctrl(uint8_t pin_control)
{
uint8_t pc = pin_control;
int8_t st;
if (pc >= PC_MAX)
return 1;
switch (pc) {
case PC_LOAD0_CLR:
st = pin_set(E_PIN_LOAD0, 0);
break;
case PC_LOAD0_SET:
st = pin_set(E_PIN_LOAD0, 1);
break;
case PC_LOAD1_CLR:
st = pin_set(E_PIN_LOAD1, 0);
break;
case PC_LOAD1_SET:
st = pin_set(E_PIN_LOAD1, 1);
break;
case PC_LOAD2_CLR:
st = pin_set(E_PIN_LOAD2, 0);
break;
case PC_LOAD2_SET:
st = pin_set(E_PIN_LOAD2, 1);
break;
case PC_D0_CLR:
st = pin_set(E_PIN_D0, 0);
break;
case PC_D0_SET:
st = pin_set(E_PIN_D0, 1);
break;
case PC_D1_CLR:
st = pin_set(E_PIN_D1, 0);
break;
case PC_D1_SET:
st = pin_set(E_PIN_D1, 1);
break;
case PC_D2_CLR:
st = pin_set(E_PIN_D2, 0);
break;
case PC_D2_SET:
st = pin_set(E_PIN_D2, 1);
break;
case PC_D3_CLR:
st = pin_set(E_PIN_D3, 0);
break;
case PC_D3_SET:
st = pin_set(E_PIN_D3, 1);
break;
case PC_D4_CLR:
st = pin_set(E_PIN_D4, 0);
break;
case PC_D4_SET:
st = pin_set(E_PIN_D4, 1);
break;
case PC_D5_CLR:
st = pin_set(E_PIN_D5, 0);
break;
case PC_D5_SET:
st = pin_set(E_PIN_D5, 1);
break;
case PC_D6_CLR:
st = pin_set(E_PIN_D6, 0);
break;
case PC_D6_SET:
st = pin_set(E_PIN_D6, 1);
break;
case PC_D7_CLR:
st = pin_set(E_PIN_D7, 0);
break;
case PC_D7_SET:
st = pin_set(E_PIN_D7, 1);
break;
}
if (st)
return 2;
return 0;
}
static struct latch_t *__get_lh_stat(uint8_t latch)
{
uint8_t lh = latch;
if (lh == LOAD0)
return &LH0;
if (lh == LOAD1)
return &LH1;
if (lh == LOAD2)
return &LH2;
return 0;
}
static void __latch0_set(void)
{
struct latch_t *lh_p = __get_lh_stat(LOAD0);
pin_set(E_PIN_D4, lh_p->d4);
pin_set(E_PIN_D5, lh_p->d5);
pin_set(E_PIN_D6, lh_p->d6);
pin_set(E_PIN_D7, lh_p->d7);
return;
}
static void __latch1_set(void)
{
struct latch_t *lh_p = __get_lh_stat(LOAD1);
pin_set(E_PIN_D0, lh_p->d0);
pin_set(E_PIN_D5, lh_p->d5);
pin_set(E_PIN_D6, lh_p->d6);
return;
}
static void __latch2_set(void)
{
struct latch_t *lh_p = __get_lh_stat(LOAD2);
pin_set(E_PIN_D0, lh_p->d0);
pin_set(E_PIN_D1, lh_p->d1);
pin_set(E_PIN_D2, lh_p->d2);
pin_set(E_PIN_D3, lh_p->d3);
pin_set(E_PIN_D4, lh_p->d4);
pin_set(E_PIN_D6, lh_p->d6);
pin_set(E_PIN_D7, lh_p->d7);
return;
}
static uint8_t __latch0_as_gpio(void)
{
__pin_ctrl(PC_LOAD0_CLR);
spi_close(SPI0);
spi_close(SPI1);
add_pin_d0_d3();
return 0;
}
static uint8_t __latch0_as_spi(void)
{
remove_pin_d0_d3();
Board_initSPI();
spi_open(SPI0, SPI_RATE_1M, SPI_POL0, SPI_PHA1); //SPI 1M: LED
spi_open(SPI1, SPI_RATE_4M, SPI_POL0, SPI_PHA1); //SPI 4M: ADC、DAC
__latch0_set();
__pin_ctrl(PC_LOAD0_SET);
return 0;
}
uint8_t update_latch_stat(uint8_t latch, uint8_t dio, uint8_t value)
{
uint8_t lh = latch;
uint8_t d = dio;
uint8_t val = value;
struct latch_t *lh_p;
if (lh >= LOAD_MAX)
return 1;
if (d >= D_MAX)
return 2;
if (val != 1 && value != 0)
return 3;
lh_p = __get_lh_stat(lh);
switch (d) {
case D0:
lh_p->d0 = val;
break;
case D1:
lh_p->d1 = val;
break;
case D2:
lh_p->d2 = val;
break;
case D3:
lh_p->d3 = val;
break;
case D4:
lh_p->d4 = val;
break;
case D5:
lh_p->d5 = val;
break;
case D6:
lh_p->d6 = val;
break;
case D7:
lh_p->d7 = val;
break;
}
return 0;
}
uint8_t latch_single_ctrl(uint8_t latch, uint8_t dio, uint8_t value)
{
// control one latch pin -> update_latch_stat -> what latch to update? -> latch?_ctrl
uint8_t lh = latch;
uint8_t d = dio;
uint8_t val = value;
if (lh >= LOAD_MAX)
return 1;
if (d >= D_MAX)
return 2;
if (val != 1 && value != 0)
return 3;
update_latch_stat(lh, d, val);
switch (lh) {
case LOAD0:
__latch0_set();
break;
case LOAD1:
__latch0_as_gpio();
__latch1_set();
__pin_ctrl(PC_LOAD1_SET);
__pin_ctrl(PC_LOAD1_CLR);
__latch0_as_spi();
break;
case LOAD2:
__latch0_as_gpio();
__latch2_set();
__pin_ctrl(PC_LOAD2_SET);
__pin_ctrl(PC_LOAD2_CLR);
__latch0_as_spi();
break;
}
return 0;
}
uint8_t latch_multi_ctrl(void)
{
// control many latch pin -> update_latch_stat -> update_latch_stat -> ... -> latch_ctrl 0.1.2
__latch0_set();
__pin_ctrl(PC_LOAD0_SET);
__latch0_as_gpio();
__latch1_set();
__pin_ctrl(PC_LOAD1_SET);
__pin_ctrl(PC_LOAD1_CLR);
__latch2_set();
__pin_ctrl(PC_LOAD2_SET);
__pin_ctrl(PC_LOAD2_CLR);
__latch0_as_spi();
return 0;
}
@@ -0,0 +1,41 @@
#ifndef DAC_MAX5136_H
#define DAC_MAX5136_H
#ifdef __cplusplus
extern "C" {
#endif
#include "driver/spi_ctrl.h"
#define CTRL_B_LDAC 0x01
#define CTRL_B_CLR 0x02
#define CTRL_B_POW_CTRL 0x03
#define CTRL_B_LINEARITY 0x05
#define CTRL_B_WRT(_d0, _d1) (0x10 | ((_d1) << 1) | (_d0))
#define CTRL_B_WRT_THR(_d0, _d1) (0x30 | ((_d1) << 1) | (_d0))
#define DATA_B_LDAC(_d0, _d1) ((_d1) << 9 | (_d0) << 8)
#define DATA_B_POW_CT(_d0, _d1, _rd) ((_d1) << 9 | (_d0) << 8 | (_rd) << 7)
#define DATA_B_LINE(_en) ((_en) << 9)
#define DAC0_EN 1
#define DAC0_DIS 0
#define DAC1_EN 1
#define DAC1_DIS 0
#define DAC0_W_T(_v) dac_write_through_mode(DAC0_EN, DAC1_DIS, _v);
#define DAC0_W(_v) dac_write_mode(DAC0_EN, DAC1_DIS, _v);
#define DAC0_P_C(_rdy) dac_power_control_mode(DAC0_EN, DAC1_DIS, _rdy);
#define DAC0_LDAC() dac_ldac_mode(DAC0_EN, DAC1_DIS);
int dac_ldac_mode(uint8_t dac0_enable, uint8_t dac1_enable);
int dac_clear_mode();
int dac_power_control_mode(uint8_t dac0_enable, uint8_t dac1_enable, uint8_t ready_enable);
int dac_linearity_mode(uint8_t linear_enable);
int dac_write_mode(uint8_t dac0_enable, uint8_t dac1_enable, uint16_t volts);
int dac_write_through_mode(uint8_t dac0_enable, uint8_t dac1_enable, uint16_t volts);
#ifdef __cplusplus
}
#endif
#endif //DAC_MAX5136_H
@@ -0,0 +1,110 @@
#include "hardware/dac_MAX5136.h"
struct dac_series_data_t {
uint8_t control_bits;
uint16_t data_bits;
}__attribute__((packed));
static struct dac_series_data_t dac_series_data_g = {0};
static int __dac_transfer(struct dac_series_data_t *sd)
{
latch_single_ctrl(E_LATCH_CS_DAC, 0);
#define WRITE_TO_DAC(_d, _l) spi_write(SPI1, NULL, (uint8_t *)(_d), (_l))
WRITE_TO_DAC(sd, sizeof(struct dac_series_data_t));
latch_single_ctrl(E_LATCH_CS_DAC, 1);
return 0;
}
int dac_ldac_mode(uint8_t dac0_enable, uint8_t dac1_enable)
{
uint8_t d0 = dac0_enable;
uint8_t d1 = dac1_enable;
struct dac_series_data_t *sd = &dac_series_data_g;
sd->control_bits = CTRL_B_LDAC;
sd->data_bits = REVERT_2_BYTE(DATA_B_LDAC(d0, d1));
__dac_transfer(sd);
return 0;
}
int dac_clear_mode()
{
struct dac_series_data_t *sd = &dac_series_data_g;
sd->control_bits = CTRL_B_CLR;
__dac_transfer(sd);
return 0;
}
int dac_power_control_mode(uint8_t dac0_enable, uint8_t dac1_enable, uint8_t ready_enable)
{
uint8_t d0 = dac0_enable;
uint8_t d1 = dac1_enable;
uint8_t rdy_en = ready_enable;
struct dac_series_data_t *sd = &dac_series_data_g;
sd->control_bits = CTRL_B_POW_CTRL;
sd->data_bits = REVERT_2_BYTE(DATA_B_POW_CT(d0, d1, rdy_en));
__dac_transfer(sd);
return 0;
}
int dac_linearity_mode(uint8_t linear_enable)
{
uint8_t lin_en = linear_enable;
struct dac_series_data_t *sd = &dac_series_data_g;
sd->control_bits = CTRL_B_LINEARITY;
sd->data_bits = REVERT_2_BYTE(DATA_B_LINE(lin_en));
__dac_transfer(sd);
return 0;
}
int dac_write_mode(uint8_t dac0_enable, uint8_t dac1_enable, uint16_t volts)
{
uint8_t d0 = dac0_enable;
uint8_t d1 = dac1_enable;
uint16_t v = volts;
struct dac_series_data_t *sd = &dac_series_data_g;
sd->control_bits = CTRL_B_WRT(d0, d1);
sd->data_bits = REVERT_2_BYTE(v);
__dac_transfer(sd);
return 0;
}
int dac_write_through_mode(uint8_t dac0_enable, uint8_t dac1_enable, uint16_t volts)
{
uint8_t d0 = dac0_enable;
uint8_t d1 = dac1_enable;
uint16_t v = volts;
struct dac_series_data_t *sd = &dac_series_data_g;
sd->control_bits = CTRL_B_WRT_THR(d0, d1);
sd->data_bits = REVERT_2_BYTE(v);
__dac_transfer(sd);
return 0;
}
@@ -0,0 +1,67 @@
#ifndef DAC_ADS1118_H
#define DAC_ADS1118_H
#ifdef __cplusplus
extern "C" {
#endif
#include "driver/spi_ctrl.h"
#define ADC_CH_CURR AIN0_GND
#define ADC_CH_VIN AIN1_GND
#define ADC_CH_BAT AIN3_GND
#define ADC_CH_VOUT AIN2_GND
#define MEASURE_CURRENT() read_adc_data(ADC_CH_CURR, FSR3)
#define MEASURE_VOLT() read_adc_data(ADC_CH_VIN, FSR3)
#define MEASURE_DAC() read_adc_data(ADC_CH_VOUT, FSR3)
#define MEASURE_BATTERY() read_adc_data(ADC_CH_BAT, FSR1)
enum input_mux_e {
AIN0_AIN1 = 0x00,
AIN0_AIN3 = 0x01,
AIN1_AIN3 = 0x02,
AIN2_AIN3 = 0x03,
AIN0_GND = 0x04,
AIN1_GND = 0x05,
AIN2_GND = 0x06,
AIN3_GND = 0x07,
};
/*
* [Progrmmable gain amplifier configuration]
*
* The corresponing relationship of FSRx to volt will be the form:
* FSRx <-> 0xXX <-> +- xV
*
* FSR1 <-> 0x00 <-> +-6.144V
* FSR2 <-> 0x01 <-> +-4.096V
* FSR3 <-> 0x02 <-> +-2.408V
* FSR4 <-> 0x03 <-> +-1.024V
* FSR5 <-> 0x04 <-> +-0.512V
* FSR6 <-> 0x05 <-> +-0.256V
* FSR7 <-> 0x06 <-> +-0.256V
* FSR8 <-> 0x07 <-> +-0.256V
*
*/
enum gain_amplifier_e {
FSR1 = 0x00,
FSR2 = 0x01,
FSR3 = 0x02,
FSR4 = 0X03,
FSR5 = 0x04,
FSR6 = 0x05,
FSR7 = 0x06,
FSR8 = 0x07,
};
uint16_t read_adc_data(uint8_t AdcChannel, uint8_t gainAmp);
#ifdef __cplusplus
}
#endif
#endif //ADC_ADS1118_H
@@ -0,0 +1,79 @@
#include "hardware/adc_ads1118.h"
static uint8_t spi_ADC_txbuf_l[2] = {0};
static uint8_t spi_ADC_rxbuf_l[2] = {0};
static void __ADC_read(uint8_t input_mux, uint8_t gAmp)
{
/*
* write SPI to get ADC value
* [7]~[0] should always be 0b11101011, data rate is 860 sps, other is default
*
* [15] : SS, 0 = no effect, 1 = start work, default 0b0
* [14]~[12] : MUX[2:0], default 0b000
*
* [Input multiplexer configuration]
*
* the MUX selection will correspond to a pin pair
* where the pair is positive and negative input
*
* MUX[2:0] <-> (AINp, AINn)
*
* 000 <-> AINp is AIN0, AINn is AIN1
* 001 <-> AINp is AIN0, AINn is AIN3
* 010 <-> AINp is AIN1, AINn is AIN3
* 011 <-> AINp is AIN2, AINn is AIN3
* 100 <-> AINp is AIN0, AINn is GND
* 101 <-> AINp is AIN1, AINn is GND
* 110 <-> AINp is AIN2, AINn is GND
* 111 <-> AINp is AIN3, AINn is GND
*
*
*
* [11]~[9] : PGA[2:0], default 0b010 = FSR is ±2.048
* [8] : mode, 0 = continuous, 1 = one shot, default 0b1 (Power-down and single-shot mode )
*
* [7]~[5] : data rate, default 0b100 = 128 SPS; 0b111 = 860 SPS
* [4] : Temperature? default 0b0 = ADC mode
* [3] : Pullup enable, default 0b1 = Pullup resistor enabled
* [2]~[1] : NOP, default 0b01
* [0] : reserved, default 0b1
*
*/
uint8_t *tx = spi_ADC_txbuf_l;
uint8_t *rx = spi_ADC_rxbuf_l;
uint8_t i_mux = input_mux;
uint8_t ga = gAmp;
tx[0] = i_mux << 4 | ga << 1 | 0b10000001;
tx[1] = 0b11101011;
latch_single_ctrl(E_LATCH_CS_ADC, 0);
spi_write(SPI1, NULL, tx, 2);
latch_single_ctrl(E_LATCH_CS_ADC, 1);
memset(tx, 0, sizeof(tx));
memset(rx, 0, sizeof(rx));
latch_single_ctrl(E_LATCH_CS_ADC, 0);
spi_write(SPI1, rx, tx, 2);
latch_single_ctrl(E_LATCH_CS_ADC, 1);
return;
}
uint16_t read_adc_data(uint8_t AdcChannel, uint8_t gainAmplifier)
{
uint8_t Adc_ch = AdcChannel;
uint8_t gainAmp = gainAmplifier;
uint16_t rx;
__ADC_read(Adc_ch, gainAmp);
rx = (uint16_t)spi_ADC_rxbuf_l[0] << 8 | (uint16_t)spi_ADC_rxbuf_l[1];
return rx;
}
@@ -0,0 +1,94 @@
#ifndef LED_APA_102_H
#define LED_APA_102_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* APA-102-2020-256-8A-20190612: Series data structure
* +-------------------+------------------------- ... -+-----------------+
* | start_frame(4B) | led_frame(4B) *LED_TANDEM_N | end_frame(4B) |
* +-------------------+------------------------- ... -+-----------------+
* / \
* / led_frame(4B) \
* / \
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | 111 | bright | blue | green | red |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
#include "driver/spi_ctrl.h"
#define DEF_LED_TANDEN_N 12
#ifdef DEF_LED_TANDEN_N
#define LED_TANDEM_N DEF_LED_TANDEN_N
#else
#define LED_TANDEM_N 12
#endif
enum led_series_nb_e {
LED_NB_1 = 0,
LED_NB_2,
LED_NB_3,
LED_NB_4,
LED_NB_5,
LED_NB_6,
LED_NB_7,
LED_NB_8,
LED_NB_9,
LED_NB_10,
LED_NB_11,
LED_NB_12,
LED_NB_MAX = LED_TANDEM_N,
};
enum led_bright_e {
LED_BR_LV0 = 0x00,
LED_BR_LV1 = 0x01,
LED_BR_LV8 = 0x08,
LED_BR_MAX = 0x1F,
};
enum led_color_e {
LED_CLR_BLACK = 0,
LED_CLR_WHITE,
LED_CLR_RED,
LED_CLR_ORANGE,
LED_CLR_YELLOW,
LED_CLR_GREEN,
LED_CLR_CYAN,
LED_CLR_BLUE,
LED_CLR_PURPLE,
LED_CLR_MAGENTA,
LED_CLR_YELLOWGREEN,
LED_CLR_EMERALD,
LED_CLR_LOW_BAT,
LED_CLR_MAX,
};
struct led_color_t {
uint8_t b;
uint8_t g;
uint8_t r;
};
struct led_frame_t {
uint8_t bright: 5,
rsvd: 3;
struct led_color_t color;
};
int led_color_set(enum led_series_nb_e led_nb, enum led_bright_e bright, enum led_color_e color);
int led_color_code_set(enum led_series_nb_e led_nb, enum led_bright_e bright, struct led_color_t *color);
int led_rainbow(enum led_bright_e bright);
#ifdef __cplusplus
}
#endif
#endif // LED_APA_102_H
@@ -0,0 +1,190 @@
#include "hardware/led_APA_102.h"
#define LED_FRME_FILL_RSVD(_f) (_f)->rsvd = 0x07 // 0x11100000 || bright
#define LED_SERIES_D_START 0x00000000
#define LED_SERIES_D_END 0xFFFFFFFF
struct led_series_data_t {
uint32_t f_start;
struct led_frame_t f_led[LED_TANDEM_N];
uint32_t f_end;
};
static struct led_series_data_t led_series_data_g = {0};
const struct led_color_t led_color_list_g[LED_CLR_MAX] = {
// {blue, green, red}
{0x00, 0x00, 0x00}, // LED_CLR_BLACK
{0xFF, 0xFF, 0xCA}, // LED_CLR_WHITE
{0x00, 0x00, 0xFF}, // LED_CLR_RED
{0x09, 0x58, 0xFF}, // LED_CLR_ORANGE
{0x00, 0xE1, 0xE1}, // LED_CLR_YELLOW
{0x00, 0xFA, 0x00}, // LED_CLR_GREEN
{0x40, 0x40, 0x00}, // LED_CLR_CYAN
{0xAA, 0x00, 0x00}, // LED_CLR_BLUE
{0x6F, 0x00, 0x3A}, // LED_CLR_PURPLE
{0xFF, 0x00, 0xFF}, // LED_CLR_MAGENTA
{0x00, 0xA6, 0x64}, // LED_CLR_YELLOWGREEN
{0x78, 0xC8, 0x50}, // LED_CLR_EMERALD
{0x05, 0x35, 0x9E}, // LED_CLR_LOW_BAT (orange)
};
static int __led_single_set(struct led_series_data_t *led_s_d, struct led_frame_t *led_f, enum led_series_nb_e led_nb)
{
struct led_series_data_t *sd = led_s_d;
struct led_frame_t *f = led_f;
enum led_series_nb_e nb = led_nb;
memcpy(&sd->f_led[nb], f, sizeof(struct led_frame_t));
return 0;
}
static int __led_multiple_set(struct led_series_data_t *led_s_d, struct led_frame_t *led_f)
{
struct led_series_data_t *sd = led_s_d;
struct led_frame_t *f = led_f;
int i;
/*
* use __led_single_set() to finish all led;
*/
for (i = LED_NB_1; i < LED_NB_MAX; i++) {
__led_single_set(sd, f, (enum led_series_nb_e)i);
}
return 0;
}
static int __led_complete(struct led_series_data_t *led_s_d)
{
struct led_series_data_t *sd = led_s_d;
struct led_frame_t *f = sd->f_led;
int i;
for (i = LED_NB_1; i < LED_NB_MAX; i++) {
LED_FRME_FILL_RSVD(f);
f++;
}
sd->f_start = LED_SERIES_D_START;
sd->f_end = LED_SERIES_D_END;
return 0;
}
static int __led_color_set(enum led_series_nb_e led_nb, struct led_frame_t *led_f)
{
enum led_series_nb_e nb = led_nb;
struct led_frame_t *f = led_f;
struct led_series_data_t *sd = &led_series_data_g;
if (f == NULL)
return -1;
/*
* nb - < LED_NB_MAX: fill one led_frame
* == LED_NB_MAX: fill multiple led_frame
*
* complete: then, fill (start_frame, end_frame and the rsvd of every led_frame)
*
* finally, write cmd to hw by spi
*/
if (nb < LED_NB_MAX) {
__led_single_set(sd, f, nb);
} else if (nb == LED_NB_MAX) {
__led_multiple_set(sd, f);
} else {
return -2;
}
__led_complete(sd);
#define WRITE_TO_HW(_d, _l) spi_write(SPI0, NULL, (uint8_t *)(_d), (_l))
WRITE_TO_HW(sd, sizeof(struct led_series_data_t));
return 0;
}
int led_color_set(enum led_series_nb_e led_nb, enum led_bright_e bright, enum led_color_e color)
{
enum led_series_nb_e nb = led_nb;
enum led_bright_e b = bright;
enum led_color_e c = color;
struct led_frame_t led_f;
if (nb > LED_NB_MAX)
return -1;
if (c >= LED_CLR_MAX)
return -2;
if (b > LED_BR_MAX)
return -3;
led_f.bright = b;
led_f.color = led_color_list_g[c];
__led_color_set(nb, &led_f);
return 0;
}
int led_color_code_set(enum led_series_nb_e led_nb, enum led_bright_e bright, struct led_color_t *color)
{
enum led_series_nb_e nb = led_nb;
enum led_bright_e b = bright;
struct led_color_t *c = color;
struct led_frame_t led_f;
// valid the input values
if (nb > LED_NB_MAX)
return -1;
if (b > LED_BR_MAX)
return -2;
led_f.bright = b;
memcpy(&led_f.color, c, sizeof(struct led_color_t));
__led_color_set(nb, &led_f);
return 0;
}
int led_rainbow(enum led_bright_e bright)
{
enum led_bright_e b = bright;
int i;
if (b > LED_BR_MAX)
return -1;
for(i=0; i<LED_NB_MAX; i++) {
led_color_set((enum led_series_nb_e)i, b, (enum led_color_e)i);
}
return 0;
}
/*
* example -
* customize color:
* struct led_color_t led_c;
* uint8_t bri;
* // { ins, ins, num, r, g, b, bri};
* uint8_t ins[20] = {0x30, 0x00, LED_NB_4, 0xFF, 0x00, 0x44, 0x3};
* led_c.r = ins[3];
* led_c.g = ins[4];
* led_c.b = ins[5];
* bri = ins[6];
* led_color_code_set(LED_NB_4, bri, &led_c);
*
* single led:
* led_color_set(LED_NB_1, LED_BR_LV1, LED_CLR_WHITE);
*
* multiple led:
* led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_BLUE);
*
* rainbow led:
* led_rainbow(LED_BR_LV1);
*/
@@ -1,179 +0,0 @@
{
"name": "Elite-ZM",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-ZM.+",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 2
},
"constant": {
"ADC_CHANNEL_NUMBER": [
12,
13,
14,
15
],
"VOLT_MAX": 4095
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": [
0,
1,
2
]
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"domain": "constant",
"value": 1
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"value": [
"I-V Curve",
"Cyclic Voltammetry",
"Function Generator",
"Z-T Curve",
"V-T Curve",
"I-T Curve",
"ADC test"
]
},
"VOLT_ORIGIN": {
"description": "Origin Voltage of Scan",
"domain": [
"VOLT_MAX"
]
},
"VOLT_FINAL": {
"description": "The last Voltage of Scan",
"domain": [
"VOLT_MAX"
],
"value": "1365 * VALUE"
},
"VOLT_STEP": {
"description": "Voltage Step",
"domain": [
5
]
},
"STEP_TIME": {
"description": "How much time between two step",
"domain": [
4
]
},
"DAC_VOLT": {
"description": "DAC output Voltage",
"domain": [
"VOLT_MAX"
]
},
"ADC_CHANNEL": {
"description": "read ADC data",
"value": [
"ANA0",
"ANA1",
"ANA2",
"ANA3"
]
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"0": "curve_iv",
"1": "curve_cv",
"2": "func_gen",
"6": "adc_test"
}
}
],
"data_format": [
"_data_format('TDC4VAF2')"
],
"curve_iv": [
"data_format",
"_notify(True)",
"curve_iv0",
"_sync(True)",
"VIS_STI"
],
"curve_iv0": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0010",
"vb": "(VOLT_FINAL + 1) * 0x0010",
"dv": "VOLT_STEP * 0x40",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X10;2B>va;2B>vb;B>dv;B>dt"
]
},
"curve_cv": [
"data_format",
"_notify(True)",
"curve_cv0",
"_sync(True)",
"VIS_STI"
],
"curve_cv0": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0010",
"vb": "(VOLT_FINAL + 1) * 0x0010",
"dv": "VOLT_STEP * 0x40",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X20;2B>va;2B>vb;B>dv;B>dt"
]
},
"func_gen": [
"data_format",
"func_gen0",
"VIS_STI"
],
"func_gen0": {
"type": "RIS",
"parameter": {
"v": "(DAC_VOLT + 1) * 0x0010"
},
"data": [
"X30;X30;2B>v"
]
},
"adc_test": [
"data_format",
"_notify(True)",
"adc_test0",
"_sync(True)",
"VIS_STI"
],
"adc_test0": {
"type": "RIS",
"data": [
"X90;B>ADC_CHANNEL"
]
}
}
}
@@ -1,246 +0,0 @@
#ifndef Elite15_PIN
#define Elite_15PIN
#include "Elite_PIN.h"
static void update_latch_status (uint32_t latch_num, uint32_t elite_pin, bool highlow) {
switch (latch_num) {
case LOAD0: {
switch (elite_pin) {
case D0: {
LH.LATCH0[0] = highlow;
break;
}
case D1: {
LH.LATCH0[1] = highlow;
break;
}
case D2: {
LH.LATCH0[2] = highlow;
break;
}
case D3: {
LH.LATCH0[3] = highlow;
break;
}
case D4: {
LH.LATCH0[4] = highlow;
break;
}
case D5: {
LH.LATCH0[5] = highlow;
break;
}
case D6: {
LH.LATCH0[6] = highlow;
break;
}
case D7: {
LH.LATCH0[7] = highlow;
break;
}
default: {
break;
}
}
break;
}
case LOAD1: {
switch (elite_pin) {
case D0: {
LH.LATCH1[0] = highlow;
break;
}
case D1: {
LH.LATCH1[1] = highlow;
break;
}
case D2: {
LH.LATCH1[2] = highlow;
break;
}
case D3: {
LH.LATCH1[3] = highlow;
break;
}
case D4: {
LH.LATCH1[4] = highlow;
break;
}
case D5: {
LH.LATCH1[5] = highlow;
break;
}
case D6: {
LH.LATCH1[6] = highlow;
break;
}
case D7: {
LH.LATCH1[7] = highlow;
break;
}
default: {
break;
}
}
break;
}
case LOAD2: {
switch (elite_pin) {
case D0: {
LH.LATCH2[0] = highlow;
break;
}
case D1: {
LH.LATCH2[1] = highlow;
break;
}
case D2: {
LH.LATCH2[2] = highlow;
break;
}
case D3: {
LH.LATCH2[3] = highlow;
break;
}
case D4: {
LH.LATCH2[4] = highlow;
break;
}
case D5: {
LH.LATCH2[5] = highlow;
break;
}
case D6: {
LH.LATCH2[6] = highlow;
break;
}
case D7: {
LH.LATCH2[7] = highlow;
break;
}
default: {
break;
}
}
break;
}
default: {
break;
}
}
}
static void PIN15_setOutputValue (uint32_t latch_num, uint32_t pin_num, bool highlow) {
ELITE15_SPI_CLOSE();
add_elite_pin();
update_latch_status (latch_num, pin_num, highlow);
// PIN_setOutputValue(&ZM_rst, latch_num, 1); // Turn on latch
switch (latch_num) {
case LOAD0: {
// PIN_setOutputValue(&ZM_rst, D0, LH.LATCH0[0]);
// PIN_setOutputValue(&ZM_rst, D1, LH.LATCH0[1]);
// PIN_setOutputValue(&ZM_rst, D2, LH.LATCH0[2]);
// PIN_setOutputValue(&ZM_rst, D3, LH.LATCH0[3]);
PIN_setOutputValue(pin_handle, D4, LH.LATCH0[4]);
PIN_setOutputValue(pin_handle, D5, LH.LATCH0[5]);
PIN_setOutputValue(pin_handle, D6, LH.LATCH0[6]);
PIN_setOutputValue(pin_handle, D7, LH.LATCH0[7]);
break;
}
case LOAD1: {
PIN_setOutputValue(pin_handle, D0, LH.LATCH1[0]);
PIN_setOutputValue(pin_handle, D1, LH.LATCH1[1]);
PIN_setOutputValue(pin_handle, D2, LH.LATCH1[2]);
PIN_setOutputValue(pin_handle, D3, LH.LATCH1[3]);
PIN_setOutputValue(pin_handle, D4, LH.LATCH1[4]);
PIN_setOutputValue(pin_handle, D5, LH.LATCH1[5]);
PIN_setOutputValue(pin_handle, D6, LH.LATCH1[6]);
PIN_setOutputValue(pin_handle, D7, LH.LATCH1[7]);
break;
}
case LOAD2: {
PIN_setOutputValue(pin_handle, D0, LH.LATCH2[0]);
PIN_setOutputValue(pin_handle, D1, LH.LATCH2[1]);
PIN_setOutputValue(pin_handle, D2, LH.LATCH2[2]);
PIN_setOutputValue(pin_handle, D3, LH.LATCH2[3]);
PIN_setOutputValue(pin_handle, D4, LH.LATCH2[4]);
PIN_setOutputValue(pin_handle, D5, LH.LATCH2[5]);
PIN_setOutputValue(pin_handle, D6, LH.LATCH2[6]);
PIN_setOutputValue(pin_handle, D7, LH.LATCH2[7]);
break;
}
default: {
break;
}
}
PIN_setOutputValue(&ZM_rst, latch_num, 1); // Turn on latch
// CPUdelay(10);
PIN_setOutputValue(&ZM_rst, latch_num, 0); // Turn off latch
remove_elite_pin();
ELITE15_SPI_HOLD();
}
static void Init_Elite15_PIN () {
InitLH();
add_elite_pin();
PIN_setOutputValue(pin_handle, D0, 0);
PIN_setOutputValue(pin_handle, D1, 0);
PIN_setOutputValue(pin_handle, D2, 0);
PIN_setOutputValue(pin_handle, D3, 0);
PIN_setOutputValue(pin_handle, D4, 0);
PIN_setOutputValue(pin_handle, D5, 0);
PIN_setOutputValue(pin_handle, D6, 0);
PIN_setOutputValue(pin_handle, D7, 0);
PIN_setOutputValue(pin_handle, LOAD0, 0);
PIN_setOutputValue(pin_handle, LOAD1, 1);
PIN_setOutputValue(pin_handle, LOAD2, 1);
CPUdelay(10);
PIN_setOutputValue(pin_handle, LOAD1, 0);
PIN_setOutputValue(pin_handle, LOAD2, 0);
PIN_setOutputValue(pin_handle, D0, 0);
PIN_setOutputValue(pin_handle, D1, 0);
PIN_setOutputValue(pin_handle, D2, 0);
PIN_setOutputValue(pin_handle, D3, 0);
PIN_setOutputValue(pin_handle, D4, 1);
PIN_setOutputValue(pin_handle, D5, 1);
PIN_setOutputValue(pin_handle, D6, 1);
PIN_setOutputValue(pin_handle, D7, 1);
CPUdelay(10);
PIN_setOutputValue(pin_handle, LOAD0, 1);
PIN_setOutputValue(pin_handle, LOAD0, 0);
remove_elite_pin();
// InitLH();
// add_elite_pin();
//
// PIN_setOutputValue(pin_handle, LOAD0, 1);
// PIN_setOutputValue(pin_handle, LOAD1, 1);
// PIN_setOutputValue(pin_handle, LOAD2, 1);
// CPUdelay(10);
// PIN_setOutputValue(pin_handle, D0, 0);
// PIN_setOutputValue(pin_handle, D1, 0);
// PIN_setOutputValue(pin_handle, D2, 0);
// PIN_setOutputValue(pin_handle, D3, 0);
// PIN_setOutputValue(pin_handle, D4, 0);
// PIN_setOutputValue(pin_handle, D5, 0);
// PIN_setOutputValue(pin_handle, D6, 0);
// PIN_setOutputValue(pin_handle, D7, 0);
// CPUdelay(10);
// PIN_setOutputValue(pin_handle, LOAD0, 0);
// PIN_setOutputValue(pin_handle, LOAD1, 0);
// PIN_setOutputValue(pin_handle, LOAD2, 0);
//
// remove_elite_pin();
}
#endif
@@ -4,21 +4,6 @@
#ifndef EliteADC
#define EliteADC
#include "Elite_PIN.h"
#include "EliteSPI.h"
// ADC command, Elite will use these cmd to control ADC
#define CMD_CURRENT_MEASURE 0xC5
#define CMD_VOLT_MEASURE 0xD5
#define CMD_DAC_MEASURE 0xE5
#define CMD_BATTERY_MEASURE 0xF1
// controller command, these are command from control box
#define ADC_CH_CURR 0x00
#define ADC_CH_VIN 0x01
#define ADC_CH_VOUT 0x02
#define ADC_CH_BAT 0x03
/* for Elite1.5-re */
// Iin theoretical boundary <2.67, 1.89~80, 63~2600, >1900 (uA)
#define I_GAIN_SMALL_BOUNDARY 4000 // 4 uA = 4,000,000 pA
@@ -31,7 +16,7 @@
// Vin theoretical boundary <7, 5~200, >100 (mV)
#define VIN_GAIN_SMALL_BOUNDARY 7000 // 7 mV = 7,000,000 nV
#define VIN_GAIN_MID1_BOUNDARY1 5000 // 5 mV = 5,000,000 nV
#define VIN_GAIN_MID1_BOUNDARY2 300000 // 300 mV = 300,000,000 nV
#define VIN_GAIN_MID1_BOUNDARY2 290000 // 290 mV = 290,000,000 nV
#define VIN_GAIN_LARGE_BOUNDARY 250000 // 250 mV = 250,000,000 nV
/*
@@ -49,7 +34,6 @@
void IinADCGainCtrl(uint8_t IinADCLevel);
void VinADCGainCtrl(uint8_t VinADCLevel);
void read_adc_raw_data(uint8_t AdcChannel, uint8_t *rxbuf, uint8_t *txbuf);
void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec_time);
void AutoGainChangeVin(int32_t RealVin);
@@ -57,300 +41,168 @@ void AutoGainChangeVin(int32_t RealVin);
= EliteADC.c =
=============================================================================*/
static void __ADC_write(uint8_t ADCin, uint8_t *rxbuf, uint8_t *txbuf)
static void __switch_lv0(uint8_t gain0_en, uint16_t plot, uint16_t *no_rec_cnt)
{
/*
* write SPI to get ADC value
* This function can only define [15]~[8] through ADCin
* [7]~[0] should always be 0b11101011
*
* [15] : SS, 0 = no effect, 1 = start work, default 0b0
* [14]~[12] : MUX[2:0], default 0b000
* [11]~[9] : PGA[2:0], default 0b010 = FSR is ±2.048
* [8] : mode, 0 = continuous, 1 = one shot, default 0b1 (Power-down and single-shot mode )
*
* [7]~[5] : data rate, default 0b100 = 128 SPS
* [4] : Temperature? default 0b0 = ADC mode
* [3] : Pullup enable, default 0b1 = Pullup resistor enabled
* [2]~[1] : NOP, default 0b01
* [0] : reserved, default 0b1
*
*/
uint8_t *rx = rxbuf;
uint8_t *tx = txbuf;
// tx[0] = 0b00000101;
for (int i=0; i<SPI_ADC_SIZE; i++) {
tx[i] = 0;
rx[i] = 0;
}
tx[0] = ADCin;
tx[1] = 0b11101011;
ADC_SPI(2, tx, rx);
return;
}
static void __ADC_read(uint8_t *rxbuf, uint8_t *txbuf)
{
/*
* read SPI to get ADC value
*/
uint8_t *rx = rxbuf;
uint8_t *tx = txbuf;
for (int i=0; i<SPI_ADC_SIZE; i++) {
tx[i] = 0;
rx[i] = 0;
}
ADC_SPI(2, tx, rx);
return;
}
static void __ADC_ch_sel(uint8_t AdcChannel, uint8_t *rxbuf, uint8_t *txbuf)
{
/*
* choise ADC channel to write
*
* set ADC parameter
* 0xC1~F1 = reading AIN0~AIN3. Using FSR+-6V, resolution = 187.5uV
* 0xC5~F5 = reading AIN0~AIN3. Using FSR+-2V, resolution = 62.5 uV
*
* ADCChannel == ADC_CH_CURR: - AINp is AIN0; AINn is GND
* - measure AIN0, which is a current measure
* == ADC_CH_VIN: - AINp is AIN1; AINn is GND
* - AIN1, which is a volt measure
* == ADC_CH_VOUT: - AINp is AIN2; AINn is GND
* - AIN2, measure DAC voltage (Note that this is NOT DAC real output value!!)
* == ADC_CH_BAT: - measure battery volt
*
*/
uint8_t ch = AdcChannel;
uint8_t *rx = rxbuf;
uint8_t *tx = txbuf;
switch (ch) {
case ADC_CH_CURR:
__ADC_write(CMD_CURRENT_MEASURE, rx, tx);
break;
case ADC_CH_VIN:
__ADC_write(CMD_VOLT_MEASURE, rx, tx);
break;
case ADC_CH_VOUT:
__ADC_write(CMD_DAC_MEASURE, rx, tx);
break;
case ADC_CH_BAT:
__ADC_write(CMD_BATTERY_MEASURE, rx, tx);
break;
default:
break;
}
return;
}
static void __read_ADC_value(uint8_t AdcChannel, uint8_t *rxbuf, uint8_t *txbuf)
{
uint8_t ch = AdcChannel;
uint8_t *rx = rxbuf;
uint8_t *tx = txbuf;
// Read data twice since the first data we get is previous data
__ADC_ch_sel(ch, rx, tx);
__ADC_read(rx, tx);
__ADC_ch_sel(ch, rx, tx);
__ADC_read(rx, tx);
return;
}
static void __reset_i_gain_cnt(int16_t *I_100R_cnt, int16_t *I_3K_cnt, int16_t *I_100K_cnt, int16_t *I_3M_cnt)
{
*I_3M_cnt = 0;
*I_100K_cnt = 0;
*I_3K_cnt = 0;
*I_100R_cnt = 0;
return;
}
static void __switch_lv0(uint8_t gain0_en, uint16_t plot, int16_t *I_GAIN_3M_counter, uint16_t *no_rec_cnt)
{
int16_t *gain_cnt = I_GAIN_3M_counter;
static int16_t gain_cnt = 0;
uint16_t *no_rec = no_rec_cnt;
uint8_t gain_en = gain0_en;
uint16_t pt = plot;
if (gain_en) {
*gain_cnt += 1;
if (gain_en == 0)
return;
if (*gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_3M;
IinADCGainCtrl(instru.IinADCGainLv);
*gain_cnt = 0;
gain_cnt++;
if (pt == IIN_VIN_VOUT_PLOT) {
*no_rec = CNT_H2L_IIN_VIN_VOUT_PLOT;
if (gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_3M;
IinADCGainCtrl(instru.IinADCGainLv);
gain_cnt = 0;
} else if (pt == IIN_VIN_PLOT) {
*no_rec = CNT_H2L_IIN_VIN_PLOT;
if (pt == IIN_VIN_VOUT_PLOT)
*no_rec = CNT_H2L_IIN_VIN_VOUT_PLOT;
} else if (pt == IT_PLOT) {
*no_rec = CNT_H2L_IT_PLOT;
else if (pt == IIN_VIN_PLOT)
*no_rec = CNT_H2L_IIN_VIN_PLOT;
}
}
else if (pt == IT_PLOT)
*no_rec = CNT_H2L_IT_PLOT;
}
return;
}
static void __switch_lv3(uint8_t gain3_en, uint16_t plot, int16_t *I_GAIN_100R_counter, uint16_t *no_rec_cnt)
static void __switch_lv3(uint8_t gain3_en, uint16_t plot, uint16_t *no_rec_cnt)
{
int16_t *gain_cnt = I_GAIN_100R_counter;
static int16_t gain_cnt = 0;
uint16_t *no_rec = no_rec_cnt;
uint8_t gain_en = gain3_en;
if (gain_en) {
*gain_cnt += 1;
if (gain_en == 0)
return;
if (*gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_100R;
IinADCGainCtrl(instru.IinADCGainLv);
*gain_cnt = 0;
*no_rec = 0;
}
gain_cnt++;
if (gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_100R;
IinADCGainCtrl(instru.IinADCGainLv);
gain_cnt = 0;
*no_rec = 0;
}
return;
}
static void __large_switch_lv1(uint8_t gain1_en, uint16_t plot, int16_t *I_GAIN_100K_counter, uint16_t *no_rec_cnt)
static void __large_switch_lv1(uint8_t gain1_en, uint16_t plot, uint16_t *no_rec_cnt)
{
int16_t *gain_cnt = I_GAIN_100K_counter;
static int16_t gain_cnt = 0;
uint16_t *no_rec = no_rec_cnt;
uint8_t gain_en = gain1_en;
uint16_t pt = plot;
if (gain_en) {
*gain_cnt += 1;
if (gain_en == 0)
return;
if (*gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_100K;
IinADCGainCtrl(instru.IinADCGainLv);
*gain_cnt = 0;
*no_rec = 0;
gain_cnt++;
if (pt == IIN_VIN_VOUT_PLOT) {
*no_rec = CNT_H2L_IIN_VIN_VOUT_PLOT;
if (gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_100K;
IinADCGainCtrl(instru.IinADCGainLv);
gain_cnt = 0;
*no_rec = 0;
} else if (pt == IIN_VIN_PLOT) {
*no_rec = CNT_H2L_IIN_VIN_PLOT;
if (pt == IIN_VIN_VOUT_PLOT)
*no_rec = CNT_H2L_IIN_VIN_VOUT_PLOT;
} else if (pt == IT_PLOT) {
*no_rec = CNT_H2L_IT_PLOT;
else if (pt == IIN_VIN_PLOT)
*no_rec = CNT_H2L_IIN_VIN_PLOT;
}
else if (pt == IT_PLOT)
*no_rec = CNT_H2L_IT_PLOT;
}
}
return;
}
static void __small_switch_lv1(uint8_t gain1_en, uint16_t plot, int16_t *I_GAIN_100K_counter, uint16_t *no_rec_cnt)
static void __small_switch_lv1(uint8_t gain1_en, uint16_t plot, uint16_t *no_rec_cnt)
{
int16_t *gain_cnt = I_GAIN_100K_counter;
static int16_t gain_cnt = 0;
uint16_t *no_rec = no_rec_cnt;
uint8_t gain_en = gain1_en;
uint16_t pt = plot;
if (gain_en) {
*gain_cnt += 1;
if (gain_en == 0)
return;
if (*gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_100K;
IinADCGainCtrl(instru.IinADCGainLv);
*gain_cnt = 0;
gain_cnt++;
if (pt == IIN_VIN_VOUT_PLOT) {
*no_rec = CNT_L2H_IIN_VIN_VOUT_PLOT;
if (gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_100K;
IinADCGainCtrl(instru.IinADCGainLv);
gain_cnt = 0;
} else if (pt == IIN_VIN_PLOT) {
*no_rec = CNT_L2H_IIN_VIN_PLOT;
if (pt == IIN_VIN_VOUT_PLOT)
*no_rec = CNT_L2H_IIN_VIN_VOUT_PLOT;
} else if (pt == IT_PLOT) {
*no_rec = CNT_L2H_IT_PLOT;
else if (pt == IIN_VIN_PLOT)
*no_rec = CNT_L2H_IIN_VIN_PLOT;
else if (pt == IT_PLOT)
*no_rec = CNT_L2H_IT_PLOT;
}
}
}
return;
}
static void __large_switch_lv2(uint8_t gain2_en, uint16_t plot, int16_t *I_GAIN_3K_counter, uint16_t *no_rec_cnt)
static void __large_switch_lv2(uint8_t gain2_en, uint16_t plot, uint16_t *no_rec_cnt)
{
int16_t *gain_cnt = I_GAIN_3K_counter;
static int16_t gain_cnt = 0;
uint16_t *no_rec = no_rec_cnt;
uint8_t gain_en = gain2_en;
uint16_t pt = plot;
if (gain_en) {
*gain_cnt += 1;
if (gain_en == 0)
return;
if (*gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_3K;
IinADCGainCtrl(instru.IinADCGainLv);
*gain_cnt = 0;
*no_rec = 0;
gain_cnt++;
if (pt == IIN_VIN_VOUT_PLOT) {
*no_rec = CNT_H2L_IIN_VIN_VOUT_PLOT;
if (gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_3K;
IinADCGainCtrl(instru.IinADCGainLv);
gain_cnt = 0;
*no_rec = 0;
} else if (pt == IIN_VIN_PLOT) {
*no_rec = CNT_H2L_IIN_VIN_PLOT;
if (pt == IIN_VIN_VOUT_PLOT)
*no_rec = CNT_H2L_IIN_VIN_VOUT_PLOT;
} else if (pt == IT_PLOT) {
*no_rec = CNT_H2L_IT_PLOT;
else if (pt == IIN_VIN_PLOT)
*no_rec = CNT_H2L_IIN_VIN_PLOT;
else if (pt == IT_PLOT)
*no_rec = CNT_H2L_IT_PLOT;
}
}
}
return;
}
static void __small_switch_lv2(uint8_t gain2_en, uint16_t plot, int16_t *I_GAIN_3K_counter, uint16_t *no_rec_cnt)
static void __small_switch_lv2(uint8_t gain2_en, uint16_t plot, uint16_t *no_rec_cnt)
{
int16_t *gain_cnt = I_GAIN_3K_counter;
static int16_t gain_cnt = 0;
uint16_t *no_rec = no_rec_cnt;
uint8_t gain_en = gain2_en;
if (gain_en) {
*gain_cnt += 1;
if (gain_en == 0)
return;
if (*gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_3K;
IinADCGainCtrl(instru.IinADCGainLv);
*gain_cnt = 0;
*no_rec = 0;
gain_cnt++;
}
if (gain_cnt > 2) {
instru.IinADCGainLv = I_GAIN_3K;
IinADCGainCtrl(instru.IinADCGainLv);
gain_cnt = 0;
*no_rec = 0;
}
return;
@@ -358,51 +210,42 @@ static void __small_switch_lv2(uint8_t gain2_en, uint16_t plot, int16_t *I_GAIN_
void IinADCGainCtrl(uint8_t IinADCLevel)
{
if (IinADCLevel>= 4)
return;
/* hardware need open before close, so don't change position*/
if (IinADCLevel == 0) {
// ADC gain level = 0, using 3M resister
PIN15_setOutputValue(Turnon_I_LARGE, 0);
PIN15_setOutputValue(Turnon_I_MID, 0);
PIN15_setOutputValue(Turnon_I_SMALL, 0);
// ADC gain level = 0, using 2M resister
update_latch_stat(E_LATCH_I_LARGE_ON, 0);
update_latch_stat(E_LATCH_I_MID_ON, 0);
update_latch_stat(E_LATCH_I_SMALL_ON, 0);
latch_multi_ctrl();
} else if (IinADCLevel == 1) {
// ADC gain level = 1, using 100K resister
PIN15_setOutputValue(Turnon_I_SMALL, 1); /* need open first */
PIN15_setOutputValue(Turnon_I_LARGE, 0);
PIN15_setOutputValue(Turnon_I_MID, 0);
// ADC gain level = 1, using 91K resister
update_latch_stat(E_LATCH_I_SMALL_ON, 1); /* need open first */
update_latch_stat(E_LATCH_I_LARGE_ON, 0);
update_latch_stat(E_LATCH_I_MID_ON, 0);
latch_multi_ctrl();
} else if (IinADCLevel == 2) {
// ADC gain level = 2, using 3K resister
PIN15_setOutputValue(Turnon_I_MID, 1); /* need open first */
PIN15_setOutputValue(Turnon_I_LARGE, 0);
PIN15_setOutputValue(Turnon_I_SMALL, 0);
// ADC gain level = 2, using 4.3K resister
update_latch_stat(E_LATCH_I_MID_ON, 1); /* need open first */
update_latch_stat(E_LATCH_I_LARGE_ON, 0);
update_latch_stat(E_LATCH_I_SMALL_ON, 0);
latch_multi_ctrl();
} else if (IinADCLevel == 3) {
// ADC gain level = 3, using 100R resistor
PIN15_setOutputValue(Turnon_I_LARGE, 1); /* need open first */
PIN15_setOutputValue(Turnon_I_MID, 0);
PIN15_setOutputValue(Turnon_I_SMALL, 0);
} else if (IinADCLevel == 4) {
// ADC gain level = 3, auto gain (using 100R resister)
PIN15_setOutputValue(Turnon_I_LARGE, 1); /* need open first */
PIN15_setOutputValue(Turnon_I_MID, 0);
PIN15_setOutputValue(Turnon_I_SMALL, 0);
} else {
// default using 100R resister
PIN15_setOutputValue(Turnon_I_LARGE, 1); /* need open first */
PIN15_setOutputValue(Turnon_I_MID, 0);
PIN15_setOutputValue(Turnon_I_SMALL, 0);
// ADC gain level = 3, using 200R resistor
update_latch_stat(E_LATCH_I_LARGE_ON, 1); /* need open first */
update_latch_stat(E_LATCH_I_MID_ON, 0);
update_latch_stat(E_LATCH_I_SMALL_ON, 0);
latch_multi_ctrl();
}
if (IinADCLevel == 0 || IinADCLevel == 1 || IinADCLevel == 2 || IinADCLevel == 3) {
lastIinADCGainLevel = IinADCLevel;
} else {
lastIinADCGainLevel = 3;
}
curr_rec_en = false;
@@ -412,38 +255,32 @@ void IinADCGainCtrl(uint8_t IinADCLevel)
void VinADCGainCtrl(uint8_t VinADCLevel)
{
if (VinADCLevel >= 3)
return;
/* hardware need open before close, so don't change position*/
if (VinADCLevel == 0) {
// Vin ADC gain level = 0, using 1M resister
PIN15_setOutputValue(Turnon_V_SMALL, 0);
PIN15_setOutputValue(Turnon_V_MID, 0);
update_latch_stat(E_LATCH_V_SMALL_ON, 0);
update_latch_stat(E_LATCH_V_MID_ON, 0);
latch_multi_ctrl();
} else if (VinADCLevel == 1) {
// Vin ADC gain level = 1, using 30K resister
PIN15_setOutputValue(Turnon_V_MID, 1); /* need open first */
PIN15_setOutputValue(Turnon_V_SMALL, 0);
update_latch_stat(E_LATCH_V_MID_ON, 1); /* need open first */
update_latch_stat(E_LATCH_V_SMALL_ON, 0);
latch_multi_ctrl();
} else if (VinADCLevel == 2) {
// Vin ADC gain level = 2, using 1K resister
PIN15_setOutputValue(Turnon_V_SMALL, 1); /* need open first */
PIN15_setOutputValue(Turnon_V_MID, 0);
} else if (VinADCLevel == 3) {
// Vin ADC gain level = 3, auto gain (using 1K resister)
PIN15_setOutputValue(Turnon_V_SMALL, 1); /* need open first */
PIN15_setOutputValue(Turnon_V_MID, 0);
} else {
// default using 1K resister
PIN15_setOutputValue(Turnon_V_SMALL, 1); /* need open first */
PIN15_setOutputValue(Turnon_V_MID, 0);
update_latch_stat(E_LATCH_V_SMALL_ON, 1); /* need open first */
update_latch_stat(E_LATCH_V_MID_ON, 0);
latch_multi_ctrl();
}
if (VinADCLevel == 0 || VinADCLevel == 1 || VinADCLevel == 2) {
lastVinADCGainLv = VinADCLevel;
} else {
lastVinADCGainLv = 2;
}
volt_rec_en = false;
@@ -451,38 +288,6 @@ void VinADCGainCtrl(uint8_t VinADCLevel)
return;
}
void read_adc_raw_data(uint8_t AdcChannel, uint8_t *rxbuf, uint8_t *txbuf)
{
uint8_t ch = AdcChannel;
uint8_t *rx = rxbuf;
uint8_t *tx = txbuf;
if (ch == RIS_ADC_IIN) {
__read_ADC_value(ADC_CH_CURR, rx, tx);
return;
}
if (ch == RIS_ADC_VIN) {
__read_ADC_value(ADC_CH_VIN, rx, tx);
return;
}
if (ch == RIS_ADC_VOUT) {
__read_ADC_value(ADC_CH_VOUT, rx, tx);
return;
}
if (ch == RIS_ADC_BAT) {
__read_ADC_value(ADC_CH_BAT, rx, tx);
return;
}
return;
}
void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec_time)
{
@@ -498,11 +303,6 @@ void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec
uint16_t plot = plot_type;
uint16_t *skip_time = no_rec_time;
static int16_t I_100R_cnt = 0;
static int16_t I_3K_cnt = 0;
static int16_t I_100K_cnt = 0;
static int16_t I_3M_cnt = 0;
int64_t small_gain = I_GAIN_SMALL_BOUNDARY;
int64_t mid1_gain1 = I_GAIN_MID1_BOUNDARY1;
int64_t mid1_gain2 = I_GAIN_MID1_BOUNDARY2;
@@ -518,18 +318,15 @@ void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec
if (instru.IinADCGainLv == I_GAIN_100R) {
if (curr < large_gain && curr > -1 * large_gain) {
if (curr < mid1_gain1 && curr > -1 * mid1_gain1) {
__switch_lv0(gain0_en, plot, &I_3M_cnt, skip_time);
__switch_lv0(gain0_en, plot, skip_time);
} else if (curr < mid2_gain1 && curr > -1 * mid2_gain1) {
__large_switch_lv1(gain1_en, plot, &I_100K_cnt, skip_time);
__large_switch_lv1(gain1_en, plot, skip_time);
} else {
__large_switch_lv2(gain2_en, plot, &I_3K_cnt, skip_time);
__large_switch_lv2(gain2_en, plot, skip_time);
}
} else {
__reset_i_gain_cnt(&I_100R_cnt, &I_3K_cnt, &I_100K_cnt, &I_3M_cnt);
}
return;
@@ -537,19 +334,16 @@ void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec
if (instru.IinADCGainLv == I_GAIN_3K) {
if (curr > mid2_gain2 || curr < -1 * mid2_gain2) {
__switch_lv3(gain3_en, plot, &I_100R_cnt, skip_time);
__switch_lv3(gain3_en, plot, skip_time);
} else if (curr < mid2_gain1 && curr > -1 * mid2_gain1) {
if (curr < mid1_gain1 && curr > -1 * mid1_gain1) {
__switch_lv0(gain0_en, plot, &I_3M_cnt, skip_time);
__switch_lv0(gain0_en, plot, skip_time);
} else {
__large_switch_lv1(gain1_en, plot, &I_100K_cnt, skip_time);
__large_switch_lv1(gain1_en, plot, skip_time);
}
} else {
__reset_i_gain_cnt(&I_100R_cnt, &I_3K_cnt, &I_100K_cnt, &I_3M_cnt);
}
return;
@@ -557,19 +351,16 @@ void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec
if (instru.IinADCGainLv == I_GAIN_100K) {
if (curr < mid1_gain1 && curr > -1 * mid1_gain1) {
__switch_lv0(gain0_en, plot, &I_3M_cnt, skip_time);
__switch_lv0(gain0_en, plot, skip_time);
} else if (curr > mid1_gain2 || curr < -1 * mid1_gain2) {
if (curr > mid2_gain2 || curr < -1 * mid2_gain2) {
__switch_lv3(gain3_en, plot, &I_100R_cnt, skip_time);
__switch_lv3(gain3_en, plot, skip_time);
} else {
__small_switch_lv2(gain2_en, plot, &I_3K_cnt, skip_time);
__small_switch_lv2(gain2_en, plot, skip_time);
}
} else {
__reset_i_gain_cnt(&I_100R_cnt, &I_3K_cnt, &I_100K_cnt, &I_3M_cnt);
}
return;
@@ -578,18 +369,15 @@ void AutoGainChangeIin(int32_t RealCurrent, uint16_t plot_type, uint16_t *no_rec
if (instru.IinADCGainLv == I_GAIN_3M) {
if (curr > small_gain || curr < -1 * small_gain) {
if (curr > mid2_gain2 || curr < -1 * mid2_gain2) {
__switch_lv3(gain3_en, plot, &I_100R_cnt, skip_time);
__switch_lv3(gain3_en, plot, skip_time);
} else if (curr > mid1_gain2 || curr < -1 * mid1_gain2) {
__small_switch_lv2(gain2_en, plot, &I_3K_cnt, skip_time);
__small_switch_lv2(gain2_en, plot, skip_time);
} else {
__small_switch_lv1(gain1_en, plot, &I_100K_cnt, skip_time);
__small_switch_lv1(gain1_en, plot, skip_time);
}
} else {
__reset_i_gain_cnt(&I_100R_cnt, &I_3K_cnt, &I_100K_cnt, &I_3M_cnt);
}
return;
@@ -4,55 +4,29 @@
static bool DACReset;
#ifdef ELITE_VERSION_1_4
#define DACCLS 0x02
#define DACOUT 0x31
static uint16_t DAC_outputV(uint16_t voltLV) {
// C = command, X = don't care, D = data
// CCCC CCCC = command
// DDDD DDDD = v1
// DDDD DDDD = v2
// command
// 0x02 = clear
// 0x31 = output voltage
uint8_t v1, v2 = 0;
v1 = (uint8_t) ((voltLV & 0xFF00) >> 8);
v2 = (uint8_t) (voltLV & 0x00FF);
spi_DACtxbuf[0] = DACOUT;
spi_DACtxbuf[1] = v1;
spi_DACtxbuf[2] = v2;
DAC_SPI(SPI_DAC_SIZE, spi_DACtxbuf, spi_rxbuf);
return voltLV;
}
static void VoutGainControl(uint8_t VOUTLevel){
if(VOUTLevel == 0){
// VOUT gain level = 0, using 240K resister
PIN15_setOutputValue(Turnon_VOUT_SMALL, 0);
latch_single_ctrl(E_LATCH_VOUT_SMALL_ON, 0);
}
else if(VOUTLevel == 1){
// VOUT gain level = 1, using 15K resister
PIN15_setOutputValue(Turnon_VOUT_SMALL, 1);
latch_single_ctrl(E_LATCH_VOUT_SMALL_ON, 1);
}
else if(VOUTLevel == 2){
// VOUT gain level = 2, using 15K resister
PIN15_setOutputValue(Turnon_VOUT_SMALL, 1);
latch_single_ctrl(E_LATCH_VOUT_SMALL_ON, 1);
}
else{
// default using 15K resister
PIN15_setOutputValue(Turnon_VOUT_SMALL, 1);
latch_single_ctrl(E_LATCH_VOUT_SMALL_ON, 1);
}
volt_rec_en = false;
}
#endif
static int32_t User2Real(uint16_t UserCode){
/* transfer usercode to real voltage value (mV) */
return (int32_t)((UserCode - 25000) / 5);
@@ -70,11 +44,6 @@ static void AutoGainChangeVout(int32_t userCode){
// switch to 1 level volt(small) 15K
// switch to 2 level volt(large) 240K
if(instru.VoutGainLv == VOUT_GAIN_AUTO){
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
}
if(instru.VoutGainLv == VOUT_GAIN_15K){
if(RealVolt > DAC_VOUT_GAIN_LARGE_BOUNDARY || RealVolt < -1 * DAC_VOUT_GAIN_LARGE_BOUNDARY){
// switch to 2 level volt(large)
@@ -1,32 +0,0 @@
#ifndef ELITE_FLAG_CT_INIT
#define ELITE_FLAG_CT_INIT
// GPT counter
struct _GPT{
uint32_t GptimerCounter;
uint32_t GptimerCounter0;
uint8_t DeltaGptimerCounter;
uint32_t SampleRateCounter;
uint32_t NotifyCounter;
uint32_t VscanRateCounter;
uint32_t LeadTimeCounter;
uint32_t BatteryADCCounter;
uint32_t BatteryCheckCounter;
uint32_t GptimerMultiple;
uint32_t StiCounter;
}GPT = {0};
static void InitGPT(){
GPT.GptimerCounter = 0;
GPT.GptimerCounter0 = 0;
GPT.DeltaGptimerCounter = 0;
GPT.SampleRateCounter = 0;
GPT.NotifyCounter = 0;
GPT.VscanRateCounter = 0;
GPT.LeadTimeCounter = 0;
GPT.BatteryADCCounter = 0;
GPT.BatteryCheckCounter = 0;
GPT.StiCounter = 0;
}
#endif
@@ -1,38 +0,0 @@
/* Copyright (c) 2019. BioPro. Scientific.
*/
#ifndef HEADSTAGE_GPTIMER_H
#define HEADSTAGE_GPTIMER_H
#include <Board.h>
#include <ti/drivers/timer/GPTimerCC26XX.h>
#include <ti/sysbios/BIOS.h>
#include <xdc/runtime/Types.h>
#define EVT_PERIODIC_GPTIMER EVT_PERIODIC_0
static GPTimerCC26XX_Handle gptimer_handle;
static void elite_gptimer_callback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask);
#define elite_gptimer_start() GPTimerCC26XX_start(gptimer_handle)
#define elite_gptimer_stop() GPTimerCC26XX_stop(gptimer_handle)
#define elite_gptimer_close() GPTimerCC26XX_close(gptimer_handle)
#define CLOCK_FREQ 4769 // clock freq = 0.1 ms(4800), Measured(4769)
#define elite_gptimer_open() \
do { \
GPTimerCC26XX_Params params; \
GPTimerCC26XX_Params_init(&params); \
params.width = GPT_CONFIG_16BIT; \
params.mode = GPT_MODE_PERIODIC_DOWN; \
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF; \
gptimer_handle = GPTimerCC26XX_open(Board_GPTIMER0A, &params); \
Types_FreqHz freq; \
BIOS_getCpuFreq(&freq); \
GPTimerCC26XX_Value loadVal = freq.lo / 1000 - 1; /*47999*/ \
GPTimerCC26XX_setLoadValue(gptimer_handle, loadVal); \
GPTimerCC26XX_setLoadValue(gptimer_handle, CLOCK_FREQ); /* 0.1 ms*/ \
GPTimerCC26XX_registerInterrupt(gptimer_handle, elite_gptimer_callback, GPT_INT_TIMEOUT); \
} while (0)
#endif // HEADSTAGE_GPTIMER_H
@@ -1,95 +0,0 @@
#ifndef ELITE_I2C
#define ELITE_I2C
/*
* Read I2C example in
* http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/2_14_02_22/
* exports/tirtos_full_2_14_02_22/docs/doxygen/html/_i2_c_c_c26_x_x_8h.html
*
*/
#include <ti/drivers/I2C.h>
#include <ti/drivers/Power.h>
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
// I2C
static I2C_Handle I2Chandle;
static I2C_Params I2Cparams;
static I2C_Transaction i2cTrans;
#define I2CBufSize 4
static uint8_t I2CtxBuf[I2CBufSize]; // Transmit buffer
static uint8_t I2CrxBuf[I2CBufSize]; // Receive buffer
bool transferDone = false;
static void I2CCallbackFunction(I2C_Handle handle, I2C_Transaction *msg, bool transfer) {
if(transfer){
transferDone = true;
}
}
static void I2Cinit(){
I2C_init();
// Configure I2C parameters.
I2C_Params_init(&I2Cparams);
I2Cparams.transferMode = I2C_MODE_CALLBACK;
I2Cparams.transferCallbackFxn = I2CCallbackFunction;
I2Cparams.bitRate = I2C_100kHz;
// Initialize master I2C transaction structure
i2cTrans.writeCount = I2CBufSize;
i2cTrans.writeBuf = I2CtxBuf;
i2cTrans.readCount = I2CBufSize;
i2cTrans.readBuf = I2CrxBuf;
i2cTrans.slaveAddress = 0xA0;
for(int i=0 ; i<10 ; i++){
I2CtxBuf[i] = 0;
I2CrxBuf[i] = 0;
}
// Open I2C
I2Chandle = I2C_open(Board_I2C, &I2Cparams);
}
#define WriteMem 0b10100001
#define ReadMem 0b10100000
static void I2CWrite(uint8_t addr, uint8_t data){
for(int i=0 ; i<I2CBufSize ; i++){
I2CtxBuf[i] = 0;
I2CrxBuf[i] = 0;
}
I2CtxBuf[0] = WriteMem;
I2CtxBuf[1] = addr;
I2CtxBuf[2] = data;
// I2Chandle = I2C_open(Board_I2C, &I2Cparams);
I2C_transfer(I2Chandle, &i2cTrans);
// I2C_close(I2Chandle);
}
static void I2CRead(uint8_t addr){
for(int i=0 ; i<I2CBufSize ; i++){
I2CtxBuf[i] = 0;
I2CrxBuf[i] = 0;
}
I2CtxBuf[0] = ReadMem;
I2CtxBuf[1] = addr;
// I2Chandle = I2C_open(Board_I2C, &I2Cparams);
I2C_transfer(I2Chandle, &i2cTrans);
// I2C_close(I2Chandle);
}
#endif // ELITE_I2C
@@ -47,6 +47,8 @@ struct HEADSTAGE_INSTRUCTION {
uint16_t cycleNumber;
uint8_t charge;
int32_t constantCurrent;
// uint8_t cc_resistance;
uint8_t cc_cp_speed;
// uni pulse mode
int32_t v0;
@@ -64,35 +66,12 @@ struct HEADSTAGE_INSTRUCTION {
int32_t v_1;
int32_t v_2;
// pulse mode
int32_t sti_v1;
int32_t sti_v2;
int32_t sti_v3;
int32_t sti_v4;
int32_t sti_v5;
int32_t sti_v6;
int32_t sti_v7;
int32_t sti_t1;
int32_t sti_t2;
int32_t sti_t3;
int32_t sti_t4;
int32_t sti_t5;
int32_t sti_t6;
int32_t sti_t7;
uint16_t sti_cy;
uint16_t sti_loop;
int32_t Vout;
// not use
int32_t Currentmax;
uint8_t VoViSwitch;
} instru = {0};
/** Iin, Vin, Vout **/
@@ -162,12 +141,12 @@ static void InitEliteInstruction(void)
instru.IinADCAutoGainEn = 1;
instru.VinADCAutoGainEn = 1;
instru.VoutAutoGainEn = 1;
instru.IinADCGainLv = I_GAIN_AUTO;
instru.VinADCGainLv = VIN_GAIN_AUTO;
instru.VoutGainLv = VOUT_GAIN_AUTO;
instru.IinADCGainLv = I_GAIN_100R;
instru.VinADCGainLv = VIN_GAIN_1K;
instru.VoutGainLv = VOUT_GAIN_15K;
instru.gain_switch_on = 0b11110000; // cur auto gain switch, |lv0|lv1|lv2|lv3|none|none|none|none|
instru.AdcChannel = 0; // RIS_ADC_IIN: 0x00, RIS_ADC_VIN: 0x01, RIS_DAC_VOUT: 0x02, RIS_HIGH_Z: 0x03
instru.hign_z_en = 1;
instru.hign_z_en = 0;
instru.cycleNumber = 1;
instru.charge = 1; // 0:discharge, 1:charge
@@ -205,24 +184,6 @@ static void InitEliteInstruction(void)
instru.v_1 = 0;
instru.v_2 = 0;
//pulse mode
instru.sti_t1 = 0;
instru.sti_t2 = 0;
instru.sti_t3 = 0;
instru.sti_t4 = 0;
instru.sti_t5 = 0;
instru.sti_t6 = 0;
instru.sti_t7 = 0;
instru.sti_v1 = DAC_ZERO;
instru.sti_v2 = DAC_ZERO;
instru.sti_v3 = DAC_ZERO;
instru.sti_v4 = DAC_ZERO;
instru.sti_v5 = DAC_ZERO;
instru.sti_v6 = DAC_ZERO;
instru.sti_v7 = DAC_ZERO;
instru.sti_loop = 1;
instru.sti_cy = 0;
instru.Vout = 0;
// not use
@@ -1,74 +0,0 @@
#ifndef ELITEKEYDETECT
#define ELITEKEYDETECT
static bool TurnOnElite(uint8_t key) {
static uint16_t TurnOnCounter = 0;
if (key == 0) {
// press 1 sec, power on LED, read bat power
if (TurnOnCounter >= CLOCK_ONE_SECOND) {
headstage_battery_volt();
uint16_t bat = NotifyVoltBat;
if( bat < 768 && bat > 20){
PIN15_setOutputValue(enable_5v, 0);
return false;
}else{
PIN15_setOutputValue(enable_5v, 1); // enable 5V
TurnOn10V();
ModeLED(BT_WAIT);
return true;
}
} else {
TurnOnCounter++;
return false;
}
} else {
TurnOnCounter = 0;
PIN15_setOutputValue(enable_5v, 0); // disable 5V
return false;
}
}
static void EliteKeyPress(uint8_t key) {
static uint16_t ShutDownCounter = 0;
static uint8_t OriginEliteFxn = 0;
if (key == 0) {
// key = 0 if press
// press key => bight LED
if (ShutDownCounter == CLOCK_ONE_SECOND) {
KEYLED();
}
// press 3~4 sec, shutdown 2650
else if (ShutDownCounter > (CLOCK_ONE_SECOND*3) ) {
LED_color(DARKLED, 0xFF, 0xFF, 0x00);
PIN15_setOutputValue(enable_5v, 0); // disable 5V
}
ShutDownCounter ++;
} else {
if (OriginEliteFxn == instru.eliteFxn) { // old function == currunt instruction
if (ShutDownCounter != 0) {
// dark LED
checkFlafLED();
ShutDownCounter = 0;
}
} else { // old function != currunt instruction
OriginEliteFxn = instru.eliteFxn;
if (ShutDownCounter != 0) {
ShutDownCounter = 0;
}
checkFlafLED();
}
}
}
static void TurnOn10V() {
If10Von = true;
PIN15_setOutputValue(enable_10v, 1);
CPUdelay(8000);
}
#endif
@@ -2,9 +2,6 @@
#ifndef ELITELED
#define ELITELED
#define DARKLED 0xE1
#define LIGHTLED 0xE8
static bool btWaitLedFlag = 0;
static bool noEventLedFlag = 0;
static bool preWorkLedFlag = 0;
@@ -13,93 +10,6 @@ static bool postWorkLedFlag = 0;
static void WorkModeLED();
static void LED_color(uint8_t bright, uint8_t red, uint8_t green, uint8_t blue) {
spi_LEDtxbuf[0] = 0x0000;
spi_LEDtxbuf[1] = 0x0000;
for (int i = 2; i < SPI_LED_SIZE - 2; i += 2) {
spi_LEDtxbuf[i] = 0xE000 | ((uint16_t)bright << 8) | blue;
spi_LEDtxbuf[i + 1] = ((uint16_t)green << 8) | red;
}
spi_LEDtxbuf[SPI_LED_SIZE - 2] = 0xffff;
spi_LEDtxbuf[SPI_LED_SIZE - 1] = 0xffff;
LED_SPI(SPI_LED_SIZE, spi_LEDtxbuf, spi_LEDrxbuf);
}
static void Elite_led_color(uint16_t color){
switch (color) {
case COLOR_RED: {
LED_color(DARKLED, 0xFF, 0x00, 0x00);
break;
}
case COLOR_ORANGE: {
LED_color(DARKLED, 0xFF, 0x58, 0x09);
break;
}
case COLOR_YELLOW: {
LED_color(LIGHTLED, 0xFF, 0x80, 0x00);
break;
}
case COLOR_GREEN: {
LED_color(DARKLED, 0x00, 0xFA, 0x00);
break;
}
case COLOR_YELLOWGREEN: {
LED_color(DARKLED, 0x64, 0xA6, 0x00);
break;
}
case COLOR_BLUE: {
LED_color(DARKLED, 0x00, 0x00, 0xAA);
break;
}
case COLOR_CYAN: {
LED_color(DARKLED, 0x00, 0x40, 0x40);
break;
}
case COLOR_MAGENTA: {
LED_color(DARKLED, 0xFF, 0x00, 0x80);
break;
}
case COLOR_PURPLE: {
LED_color(DARKLED, 0xFF, 0x00, 0xFF);
break;
}
case COLOR_WHITE: {
LED_color(DARKLED, 0xCA, 0xFF, 0xFF);
break;
}
case COLOR_BLACK: {
LED_color(0x00, 0x00, 0x00, 0x00);
break;
}
//dark LED
case COLOR_YELLOW_DARK: {
LED_color(DARKLED, 0xFF, 0x80, 0x00);
break;
}
case COLOR_GREEN_DARK: {
LED_color(DARKLED, 0x00, 0x33, 0x00);
break;
}
case COLOR_BLUE_DARK: {
LED_color(DARKLED, 0x00, 0x00, 0x33);
break;
}
case COLOR_CYAN_DARK: {
LED_color(DARKLED, 0x00, 0x10, 0x10);
break;
}
case COLOR_PURPLE_DARK: {
LED_color(DARKLED, 0x55, 0x00, 0x55);
break;
}
default: {
break;
}
}
}
static void ModeLED(uint16_t modeStatus) {
btWaitLedFlag = 0;
noEventLedFlag = 0;
@@ -108,53 +18,47 @@ static void ModeLED(uint16_t modeStatus) {
postWorkLedFlag = 0;
switch (modeStatus) {
case BT_WAIT: {
btWaitLedFlag = 1;
BT_WAIT_LED();
break;
}
case NO_EVENT: {
noEventLedFlag = 1;
LEDPowerON();
break;
}
case PRE_WORK: {
preWorkLedFlag = 1;
Elite_led_color(COLOR_BLUE);
break;
}
case WORKING: {
workingLedFlag = 1;
WorkModeLED();
break;
}
case POST_WORK: {
postWorkLedFlag = 1;
Elite_led_color(COLOR_BLUE);
break;
}
default: {
LEDPowerON();
break;
}
case BT_WAIT:
btWaitLedFlag = 1;
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_YELLOWGREEN);
break;
case NO_EVENT:
noEventLedFlag = 1;
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_GREEN);
break;
case PRE_WORK:
preWorkLedFlag = 1;
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_BLUE);
break;
case WORKING:
workingLedFlag = 1;
WorkModeLED();
break;
case POST_WORK:
postWorkLedFlag = 1;
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_GREEN);
break;
default:
break;
}
}
static void checkFlafLED()
{
if(btWaitLedFlag == 1){
if(btWaitLedFlag == 1) {
ModeLED(BT_WAIT);
}
else if(noEventLedFlag == 1){
} else if(noEventLedFlag == 1) {
ModeLED(NO_EVENT);
}
else if(preWorkLedFlag == 1){
} else if(preWorkLedFlag == 1) {
ModeLED(PRE_WORK);
}
else if(workingLedFlag == 1){
} else if(workingLedFlag == 1) {
ModeLED(WORKING);
}
else if(postWorkLedFlag == 1){
} else if(postWorkLedFlag == 1) {
ModeLED(POST_WORK);
}
}
@@ -170,25 +74,25 @@ static void WorkModeLED()
case CURVE_CV:
case CURVE_CA:
case CURVE_CC:
case CURVE_CP:
case CURVE_OCP:
case CURVE_LSV:
case CURVE_IV_CY:
case CURVE_PULSE:
case CURVE_UNI_PULSE:
case CURVE_DPV:
case CURVE_DPV_SMPRATE:
case CURVE_DPV_ADVANCE:
case CURVE_DPV_ADVANCE_SMPRATE:
WORKLED();
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_CYAN);
break;
case CURVE_CALI_ADC:
case CURVE_CALI:
if (instru.AdcChannel == RIS_ADC_IIN) {
Elite_led_color(COLOR_RED);
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_RED);
} else if (instru.AdcChannel == RIS_ADC_VIN) {
Elite_led_color(COLOR_ORANGE);
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_ORANGE);
} else if (instru.AdcChannel == RIS_DAC_VOUT) {
Elite_led_color(COLOR_BLUE);
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_BLUE);
}
break;
@@ -1,16 +0,0 @@
#ifndef ELITE_LATCH_INIT
#define ELITE_LATCH_INIT
static void InitLH() {
for (int i=0; i<LATCH_BUFF_SIZE; i++) {
LH.LATCH0[i] = 0;
LH.LATCH1[i] = 0;
LH.LATCH2[i] = 0;
}
LH.LoadState = 0;
}
#endif
@@ -11,47 +11,32 @@
#include <string.h>
/*notify's input type*/
#define NOTIFY_CURRENT 0
#define NOTIFY_VOLT 1
#define NOTIFY_IMPEDANCE 2
#define NOTIFY_CH1 0
#define NOTIFY_CH2 1
#define NOTIFY_CH3 2
#define NOTIFY_VOLT_BAT 3
#define NOTIFY_TEMPERATURE 4
#define FINISH_MODE_INS 0b10100000
static uint32_t not_time_stamp;
static uint8_t NotifyCurrent[4] = {0};
static uint8_t NotifyVolt[4] = {0};
static uint8_t NotifyImpedance[4] = {0};
static uint8_t notify_ch1[4] = {0};
static uint8_t notify_ch2[4] = {0};
static uint8_t notify_ch3[4] = {0};
static uint16_t NotifyVoltBat = 0;
static uint16_t NotifyTemperature = 0;
static uint16_t NotifyCycleNumber = 0;
static bool finishMode = false;
static int32_t notify_ch4 = 0;
static int32_t notify_ch5 = 0;
static int32_t notify_ch6 = 0;
/*
* Notify format
*
*
| | 1 | 2 | 3 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-----------------------------------------------------------------
| header |
| current |
| voltage |
| impedance |
| time stamp |
| cycle number |
cycle number
for cyclic voltammetry use, we save it as channel number.
0xFF
* header = device ID
* I = current (nA), V = voltage (uV),
* Z = impedance (ohm), T = time (ms)
*
*
*/
* +--------+----------+---------+---------+---------+-----------+-----------------+
* | id(1B) | time(4B) | ch1(4B) | ch2(4B) | ch3(4B) | cycle(2B) | finish_flag(1B) |
* | bat(4B) | notify#(1B) | ch4(4B) | ch5(4B) | ch6(4B) | __(3B) |
* +---------+-------------+---------+---------+---------+--------+
*/
static void SendNotify() {
static uint8_t notify_times = 0;
uint32_t bat = NotifyVoltBat;
@@ -64,9 +49,9 @@ static void SendNotify() {
not_buf[0] = instru.chip_id;
memcpy(not_buf+1, (uint8_t *)&not_time_stamp, sizeof(not_time_stamp));
memcpy(not_buf+5, NotifyCurrent, sizeof(NotifyCurrent));
memcpy(not_buf+9, NotifyVolt, sizeof(NotifyVolt));
memcpy(not_buf+13, NotifyImpedance, sizeof(NotifyImpedance));
memcpy(not_buf+5, notify_ch1, sizeof(notify_ch1));
memcpy(not_buf+9, notify_ch2, sizeof(notify_ch2));
memcpy(not_buf+13, notify_ch3, sizeof(notify_ch3));
memcpy(not_buf+17, (uint8_t *)&NotifyCycleNumber, sizeof(NotifyCycleNumber));
if (finishMode) {
@@ -77,8 +62,11 @@ static void SendNotify() {
memcpy(not_buf+20, (uint8_t *)&bat, sizeof(bat));
memcpy(not_buf+24, &notify_times, sizeof(notify_times));
memcpy(not_buf+25, (uint8_t *)&notify_ch4, sizeof(notify_ch4));
memcpy(not_buf+29, (uint8_t *)&notify_ch5, sizeof(notify_ch5));
memcpy(not_buf+33, (uint8_t *)&notify_ch6, sizeof(notify_ch6));
for (int i = 25; i < BLE_DAT_BUFF_SIZE; i++){
for (int i = 37; i < BLE_DAT_BUFF_SIZE; i++){
not_buf[i] = 0;
}
@@ -110,10 +98,13 @@ static void initRawDataBuf(){
finishMode = false;
for (int i = 0; i < 4; i++){
NotifyCurrent[i] = 0;
NotifyVolt[i] = 0;
NotifyImpedance[i] = 0;
notify_ch1[i] = 0;
notify_ch2[i] = 0;
notify_ch3[i] = 0;
}
notify_ch4 = 0;
notify_ch5 = 0;
notify_ch6 = 0;
}
static void FlushNotify(){
@@ -128,16 +119,16 @@ static void FlushNotify(){
static void InputNotify(int NotifyType, int32_t Data){
switch (NotifyType) {
case NOTIFY_CURRENT:
memcpy(NotifyCurrent, (uint8_t *)&Data, sizeof(Data));
case NOTIFY_CH1:
memcpy(notify_ch1, (uint8_t *)&Data, sizeof(Data));
break;
case NOTIFY_IMPEDANCE:
memcpy(NotifyImpedance, (uint8_t *)&Data, sizeof(Data));
case NOTIFY_CH3:
memcpy(notify_ch3, (uint8_t *)&Data, sizeof(Data));
break;
case NOTIFY_VOLT :
memcpy(NotifyVolt, (uint8_t *)&Data, sizeof(Data));
case NOTIFY_CH2 :
memcpy(notify_ch2, (uint8_t *)&Data, sizeof(Data));
break;
case NOTIFY_VOLT_BAT :
@@ -10,29 +10,18 @@ static void reset() {
initINSBuf();
initDATBuf();
PIN15_setOutputValue(HIGH_Z_MODE, 0); // HIGH Z MODE // 1: close; 0: open;
latch_single_ctrl(E_LATCH_HIGH_Z, 0); // HIGH Z MODE // 1: close; 0: open;
VinADCGainCtrl(VIN_GAIN_AUTO);
IinADCGainCtrl(I_GAIN_AUTO);
instru.VinADCGainLv = VIN_GAIN_1K;
VinADCGainCtrl(instru.VinADCGainLv);
instru.IinADCGainLv = I_GAIN_100R;
IinADCGainCtrl(instru.IinADCGainLv);
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
DAC0_W_T(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
for (int i = 0; i < SPI_LED_SIZE; i++) {
spi_LEDtxbuf[i] = 0;
spi_LEDrxbuf[i] = 0;
}
for (int i = 0; i < SPI_DAC_SIZE; i++) {
spi_DACtxbuf[i] = 0;
spi_rxbuf[i] = 0;
}
for (int i = 0; i < SPI_ADC_SIZE; i++) {
spi_ADC_txbuf[i] = 0;
spi_ADC_rxbuf[i] = 0;
}
ModeLED(NO_EVENT);
CPUdelay(1600);
@@ -46,27 +35,14 @@ static void Eliteinterrupt() {
initINSBuf();
initDATBuf();
PIN15_setOutputValue(HIGH_Z_MODE, 0); // HIGH Z MODE // 1: close; 0: open;
latch_single_ctrl(E_LATCH_HIGH_Z, 0); // HIGH Z MODE // 1: close; 0: open;
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
for (int i = 0; i < SPI_LED_SIZE; i++) {
spi_LEDtxbuf[i] = 0;
spi_LEDrxbuf[i] = 0;
}
for (int i = 0; i < SPI_DAC_SIZE; i++) {
spi_DACtxbuf[i] = 0;
spi_rxbuf[i] = 0;
}
for (int i = 0; i < SPI_ADC_SIZE; i++) {
spi_ADC_txbuf[i] = 0;
spi_ADC_rxbuf[i] = 0;
}
DAC0_W_T(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
ADC_rxbuf = 0;
ModeLED(NO_EVENT);
CPUdelay(8000);
}
@@ -1,137 +0,0 @@
#ifndef ELITE_SPI
#define ELITE_SPI
/*
* Read SPI example in
* http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/2_14_02_22/
* exports/tirtos_full_2_14_02_22/docs/doxygen/html/_s_p_i_c_c26_x_x_d_m_a_8h.html
*/
#include <Board.h>
#include <ti/drivers/SPI.h>
#include <ti/drivers/dma/UDMACC26XX.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>
#include "Elite_PIN.h"
/* application use SPI parameters and buffers */
#define SPI_LED_SIZE 28
#define SPI_DAC_SIZE 3
#define SPI_ADC_SIZE 4
static uint16_t spi_LEDtxbuf[SPI_LED_SIZE] = {0};
static uint16_t spi_LEDrxbuf[SPI_LED_SIZE] = {0};
static uint8_t spi_DACtxbuf[SPI_DAC_SIZE] = {0};
static uint8_t spi_rxbuf[SPI_DAC_SIZE] = {0};
static uint8_t spi_ADC_txbuf[SPI_ADC_SIZE] = {0};
static uint8_t spi_ADC_rxbuf[SPI_ADC_SIZE] = {0};
/* system use SPI parameters */
static SPI_Handle spiHandle0 = NULL; // SPI0 = LED
static SPI_Handle spiHandle1 = NULL; // SPI1 = ADC +DAC
static SPI_Params spiParams0;
static SPI_Params spiParams1;
static SPI_Transaction LED_transaction;
static SPI_Transaction ADC_DAC_transaction;
static void ELITE15_SPI_HOLD();
static void ELITE15_SPI_CLOSE();
static void Elite_SPI_init(){
SPI_init();
SPI_Params_init(&spiParams0);
spiParams0.bitRate = 10000000; // 10M
spiParams0.mode = SPI_MASTER;
spiParams0.dataSize = 16;
spiParams0.frameFormat = SPI_POL0_PHA1;
spiHandle0 = SPI_open(Board_SPI0, &spiParams0); // LED SPI
SPI_Params_init(&spiParams1);
spiParams1.bitRate = 10000000; // 10M
spiParams1.mode = SPI_MASTER;
spiParams1.dataSize = 8;
spiParams1.frameFormat = SPI_POL0_PHA1;
spiHandle1 = SPI_open(Board_SPI1, &spiParams1); // ADC DAC SPI
}
static void LED_SPI(uint8_t length, uint16_t *spi_txbuf, uint16_t *spi_rxbuf) {
LED_transaction.count = length;
LED_transaction.txBuf = spi_txbuf;
LED_transaction.rxBuf = spi_rxbuf;
SPI_transfer(spiHandle0, &LED_transaction);
}
static void ADC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
// PIN15_setOutputValue(ADC_CS, 0); // ADC_CS LOW
PIN_setOutputValue(pin_handle, LOAD0, 1);
PIN_setOutputValue(pin_handle, D6, 0); // ADC_CS LOW
ADC_DAC_transaction.count = length;
ADC_DAC_transaction.txBuf = spi_txbuf;
ADC_DAC_transaction.rxBuf = spi_rxbuf;
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, D6, 1); // ADC_CS HIGH
update_latch_status (ADC_CS, 1);
// PIN15_setOutputValue(ADC_CS, 1); // ADC_CS HIGH
}
static void DAC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
// PIN15_setOutputValue(DAC_CS, 0); // DAC_CS LOW
PIN_setOutputValue(pin_handle, LOAD0, 1);
PIN_setOutputValue(pin_handle, D7, 0); // DAC_CS LOW
ADC_DAC_transaction.count = length;
ADC_DAC_transaction.txBuf = spi_txbuf;
ADC_DAC_transaction.rxBuf = spi_rxbuf;
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, D7, 1); // DAC_CS HIGH
update_latch_status (DAC_CS, 1);
// PIN15_setOutputValue(DAC_CS, 1); // DAC_CS HIGH
}
static void ELITE15_SPI_HOLD() {
Elite_SPI_init();
#ifdef ELITE_PIN_1_5_RE
PIN_setOutputValue(pin_handle, D6, LH.LATCH0[6]); // ADC_CS
PIN_setOutputValue(pin_handle, D7, LH.LATCH0[7]); // DAC_CS
PIN_setOutputValue(pin_handle, D4, LH.LATCH0[4]); // update HIGH_Z_MODE
#endif
PIN_setOutputValue(pin_handle, LOAD0, 1);
PIN_setOutputValue(pin_handle, LOAD1, 0);
PIN_setOutputValue(pin_handle, LOAD2, 0);
}
static void ELITE15_SPI_CLOSE() {
PIN_setOutputValue(pin_handle, LOAD0, 0);
PIN_setOutputValue(pin_handle, LOAD1, 0);
PIN_setOutputValue(pin_handle, LOAD2, 0);
SPI_close(spiHandle0);
SPI_close(spiHandle1);
}
/* Elite1.5 Calibration SPI */
static void CAL_ADC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
// PIN15_setOutputValue(ADC_CS, 0); // ADC_CS LOW
PIN_setOutputValue(pin_handle, LOAD0, 1);
PIN_setOutputValue(pin_handle, D6, 0); // ADC_CS LOW
ADC_DAC_transaction.count = length;
ADC_DAC_transaction.txBuf = spi_txbuf;
ADC_DAC_transaction.rxBuf = spi_rxbuf;
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, D6, 1); // ADC_CS HOGH
update_latch_status (ADC_CS, 1);
// PIN15_setOutputValue(ADC_CS, 1); // ADC_CS HIGH
}
#endif // ELITE_SPI
@@ -205,6 +205,27 @@ struct wm_ocp_ctx_t {
struct wm_meas_t measure;
};
struct wm_adc_cali_ctx_t {
struct wm_meas_t measure;
uint16_t _cali_count;
int32_t _ADCValueSUM;
};
#define GET_ADC_SUM(_m) (((struct wm_adc_cali_ctx_t *)(_m))->_ADCValueSUM)
#define GET_CALI_COUNT(_m) (((struct wm_adc_cali_ctx_t *)(_m))->_cali_count)
struct wm_cp_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
int32_t _Vmax;
int32_t _Vmin;
int32_t _Vset;
int32_t _Iset;
uint8_t _charge;
};
int wm_init(void);
int wm_deinit(void);
void *wm_get(void);
@@ -482,48 +503,6 @@ static int __ca_create(void)
return 0;
}
static int __pulse_create(void)
{
struct wm_meas_t *m;
struct wm_pulse_ctx_t *p;
void **wm = &workMode_p;
p = malloc(sizeof(struct wm_pulse_ctx_t));
if (!p) return -1;
m = (struct wm_meas_t *)p;
m->_measureCurrent = 0;
m->_measureVin = 0;
m->_measureVout = 0;
m->_measureBat = 0;
m->_VoViSwitch = instru.VoViSwitch;
p->_Vset = 0;
p->_sti_v1 = instru.sti_v1;
p->_sti_v2 = instru.sti_v2;
p->_sti_v3 = instru.sti_v3;
p->_sti_v4 = instru.sti_v4;
p->_sti_v5 = instru.sti_v5;
p->_sti_v6 = instru.sti_v6;
p->_sti_v7 = instru.sti_v7;
p->_sti_t1 = instru.sti_t1;
p->_sti_t2 = instru.sti_t2;
p->_sti_t3 = instru.sti_t3;
p->_sti_t4 = instru.sti_t4;
p->_sti_t5 = instru.sti_t5;
p->_sti_t6 = instru.sti_t6;
p->_sti_t7 = instru.sti_t7;
p->_sti_t = instru.sti_t1;
p->_sti_v = instru.sti_v1;
p->_sti_t_flag = 1;
p->_sti_cy = instru.sti_cy;
p->_sti_lp = instru.sti_loop;
*wm = p;
return 0;
}
static int __uni_pulse_create(void)
{
struct wm_meas_t *m;
@@ -740,6 +719,57 @@ static int __ocp_create(void)
return 0;
}
static int __adc_cali_create()
{
struct wm_meas_t *m;
struct wm_adc_cali_ctx_t *p;
void **wm = &workMode_p;
p = malloc(sizeof(struct wm_adc_cali_ctx_t));
if (!p) return -1;
m = (struct wm_meas_t *)p;
m->_measureCurrent = 0;
m->_measureVin = 0;
m->_measureVout = 0;
m->_measureBat = 0;
m->_VoViSwitch = instru.VoViSwitch;
p->_ADCValueSUM = 0;
p->_cali_count = 0;
*wm = p;
return 0;
}
static int __cp_create(void)
{
struct wm_meas_t *m;
struct wm_cp_ctx_t *p;
void **wm = &workMode_p;
p = malloc(sizeof(struct wm_cp_ctx_t));
if (!p) return -1;
m = (struct wm_meas_t *)p;
m->_measureCurrent = 0;
m->_measureVin = 0;
m->_measureVout = 0;
m->_measureBat = 0;
m->_VoViSwitch = instru.VoViSwitch;
p->_Vmax = (instru.Vmax - 25000) * 4 * 10000; //[5nV]
p->_Vmin = (instru.Vmin - 25000) * 4 * 10000; //[5nV]
p->_Vset = 0;
p->_charge = instru.charge;
p->_Iset = instru.constantCurrent * 200 ;
//[50pA] //controller UI 15000uA => Elite 1500000 => 1500000 * 10 * 1000 / 50 [50pA]
*wm = p;
return 0;
}
int wm_init(void)
{
int mode = instru.eliteFxn;
@@ -788,10 +818,6 @@ int wm_init(void)
if (__ca_create()) return -2;
break;
case CURVE_PULSE:
if (__pulse_create()) return -2;
break;
case CURVE_UNI_PULSE:
if (__uni_pulse_create()) return -2;
break;
@@ -808,7 +834,14 @@ int wm_init(void)
case CURVE_DPV_ADVANCE_SMPRATE:
if (__dpv_advance_create()) return -2;
break;
case CURVE_CALI:
if (__adc_cali_create()) return -2;
break;
case CURVE_CP:
if (__cp_create()) return -2;
break;
default:
// printf("DO NOT support!!");
return -3;
@@ -1,252 +0,0 @@
#ifndef Elite_PIN
#define Elite_PIN
#include <ti/drivers/pin/PINCC26XX.h>
#include <Board.h>
#include <ti/drivers/PIN.h>
//#define ELITE_PIN_1_5
#define ELITE_PIN_1_5_RE
/* SPI Board */
#define Board_SPI0_MISO PIN_UNASSIGNED
#define Board_SPI0_MOSI D1
#define Board_SPI0_CLK D0
#define Board_SPI0_CS PIN_UNASSIGNED
#define Board_SPI1_MISO IOID_1
#define Board_SPI1_MOSI D3
#define Board_SPI1_CLK D2
#define Board_SPI1_CS PIN_UNASSIGNED
#define D0 IOID_3
#define D1 IOID_4
#define D2 IOID_5
#define D3 IOID_6
#define D4 IOID_7
#define D5 IOID_8
#define D6 IOID_9
#define D7 IOID_10
#define LOAD0 IOID_13
#define LOAD1 IOID_12
#define LOAD2 IOID_11
#define ADC_CS LOAD0, D6
#define DAC_CS LOAD0, D7
#define ADC_DAC_SPI_MOSI LOAD0, D3
#define ADC_DAC_SPI_CLK LOAD0, D2
#define LED_MOSI LOAD0, D1
#define LED_CLK LOAD0, D0
#define MEM_CS LOAD0, D5
#ifdef ELITE_PIN_1_5
#define MEM_HOLD LOAD0, D4
#define HIGH_Z_MODE LOAD2, D5
#endif
#ifdef ELITE_PIN_1_5_RE
#define MEM_HOLD LOAD1, D0
#define HIGH_Z_MODE LOAD0, D4
#endif
#define Turnon_I_MID LOAD2, D0
#define Turnon_I_SMALL LOAD2, D4
#define Turnon_I_LARGE LOAD2, D1
#define Turnon_V_SMALL LOAD2, D2
#define Turnon_V_MID LOAD2, D3
#define Turnon_VOUT_SMALL LOAD2, D7
#define shutdown_6994 LOAD2, D6
//#define Turnon10K Turnon_I_MID
//#define Turnon200R Turnon_I_LARGE
/* I2C */
#ifdef ELITE_VERSION_1_4
#define Board_I2C0_SCL0 PIN_UNASSIGNED
#define Board_I2C0_SDA0 PIN_UNASSIGNED
#endif
#define switch_on IOID_14
#define enable_10v LOAD1, D5
#define enable_5v LOAD1, D6
PIN_Handle pin_handle;
static PIN_State ZM_rst;
const PIN_Config BLE_IO[] = {
// D0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
// D1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
// D2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
// D3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
D4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
D5 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
D6 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
D7 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
LOAD0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
LOAD1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
LOAD2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
switch_on | PIN_INPUT_EN | PIN_PULLDOWN, // to sense switch
PIN_TERMINATE
};
static void add_elite_pin() {
// PIN_Status elite15_status;
PIN_add(pin_handle,
D0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
PIN_add(pin_handle,
D1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
PIN_add(pin_handle,
D2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
PIN_add(pin_handle,
D3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL);
// if(elite15_status != PIN_SUCCESS) {
// LED_color(DARKLED, 0x0F, 0x0F, 0x0F);
// }
}
static void remove_elite_pin() {
PIN_close(pin_handle);
pin_handle = PIN_open(&ZM_rst, BLE_IO);
}
/*!
* @def BOOSTXL_CC2650MA_SPIName
* @brief Enum of SPI names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_SPIName {
BOOSTXL_CC2650MA_SPI0 = 0,
BOOSTXL_CC2650MA_SPI1 = 1,
BOOSTXL_CC2650MA_SPICOUNT
} BOOSTXL_CC2650MA_SPIName;
/*
* ========================== SPI DMA begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/spi/SPICC26XXDMA.h>
/* SPI objects */
SPICC26XXDMA_Object spiCC26XXDMAObjects[BOOSTXL_CC2650MA_SPICOUNT];
/* SPI configuration structure, describing which pins are to be used */
const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[BOOSTXL_CC2650MA_SPICOUNT] = {
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.mosiPin = Board_SPI0_MOSI,
.misoPin = Board_SPI0_MISO,
.clkPin = Board_SPI0_CLK,
.csnPin = Board_SPI0_CS
},
{
.baseAddr = SSI1_BASE,
.intNum = INT_SSI1_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI1,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX,
.mosiPin = Board_SPI1_MOSI,
.misoPin = Board_SPI1_MISO,
.clkPin = Board_SPI1_CLK,
.csnPin = Board_SPI1_CS
},
};
/* SPI configuration structure */
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[0],
.hwAttrs = &spiCC26XXDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[1],
.hwAttrs = &spiCC26XXDMAHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ========================== SPI DMA end =====================================
*/
/*
* ============================= I2C Begin=====================================
*/
#ifdef ELITE_VERSION_1_4
/* Generic I2C instance identifiers */
#define Board_I2C CC2650_MA_I2C0
/*!
* @def CC2650_LAUNCHXL_I2CName
* @brief Enum of I2C names on the CC2650 dev board
*/
typedef enum CC2650_MA_I2CName {
CC2650_MA_I2C0 = 0,
CC2650_MA_I2CCOUNT
} CC2650_MA_I2CName;
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(I2C_config, ".const:I2C_config")
#pragma DATA_SECTION(i2cCC26xxHWAttrs, ".const:i2cCC26xxHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/i2c/I2CCC26XX.h>
/* I2C objects */
I2CCC26XX_Object i2cCC26xxObjects[CC2650_MA_I2CCOUNT];
/* I2C configuration structure, describing which pins are to be used */
const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2650_MA_I2CCOUNT] = {
{
.baseAddr = I2C0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_I2C0,
.intNum = INT_I2C_IRQ,
.intPriority = ~0,
.swiPriority = 0,
.sdaPin = Board_I2C0_SDA0,
.sclPin = Board_I2C0_SCL0,
}
};
/* I2C configuration structure */
const I2C_Config I2C_config[] = {
{
.fxnTablePtr = &I2CCC26XX_fxnTable,
.object = &i2cCC26xxObjects[0],
.hwAttrs = &i2cCC26xxHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ========================== I2C end =========================================
*/
#endif
#endif
@@ -34,10 +34,20 @@ static uint8_t headstage_battery_percent() {
static void headstage_battery_volt(){
uint32_t bat_volt = 0;
read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
bat_volt = (uint32_t) (spi_ADC_rxbuf[0] << 8) | (uint32_t) (spi_ADC_rxbuf[1]);
bat_volt = bat_volt * 12 / 125; //x * 187.5 * 1e-6 * 2 / 125 * 320 * 100 ;
// bat_volt = (bat_volt - 1) * 187.5 * 2;
ADC_rxbuf = MEASURE_BATTERY();
bat_volt = ADC_rxbuf;
bat_volt = (400 * bat_volt) - 268300; // uV
bat_volt /= 1e3;
// initCISBuf();
// cis_buf[0] = 6; //data len
// cis_buf[1] = BAT_DEV_TEST;
// cis_buf[2] = (uint8_t)(bat_volt >> 8);
// cis_buf[3] = (uint8_t)(bat_volt);
// SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
InputNotify(NOTIFY_VOLT_BAT, bat_volt);
}
@@ -53,11 +63,11 @@ static bool EliteADCBattery(){
static uint8_t ADCSwitch = 0;
bool read_adc_flag = false;
if(ADCSwitch == 0){ /**read V**/
read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_BATTERY();
ADCSwitch++;
}
else if(ADCSwitch == 1){ /**read V**/
read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_BATTERY();
ADCSwitch++;
}
else if(ADCSwitch == 2){ /**read V(buffer)**/
@@ -91,8 +101,11 @@ static void measureBat(){
}
uint16_t bat = NotifyVoltBat;
if( bat < 768 && bat > 20){
PIN15_setOutputValue(enable_5v, 0);
if( bat < 2900 && bat > 20){
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_LOW_BAT);
CPUdelay_ms(500);
latch_single_ctrl(E_LATCH_5V_ENABLE, 0);
}
}
@@ -17,33 +17,32 @@
#define VIS_SHIFT_200R 0x80
#define VIS_DEVICE_SHINY 0x10
#define VIS_SHINY_DIS 0x20
#define VIS_CC_ZERO 0x40
// RIS (real instruction)
enum all_mode_e {
CURVE_IV = 0x01, // I-V Curve //0x10,
CURVE_IV_CY = 0x02, // Cycle I-V //0x20,
CURVE_VO = 0x03, // Function Generator //0x30,
CURVE_RT = 0x04, // R-T Graph //0x40,
CURVE_VT = 0x05, // V-T Graph //0x50,
CURVE_IT = 0x06, // I-T Graph //0x60,
CURVE_CC = 0x07, // Constant Current (CC) //0xD0,
CURVE_IV = 0x01, // I-V Curve
CURVE_IV_CY = 0x02, // Cycle I-V
CURVE_VO = 0x03, // Function Generator
CURVE_RT = 0x04, // R-T Graph
CURVE_VT = 0x05, // V-T Graph
CURVE_IT = 0x06, // I-T Graph
CURVE_CC = 0x07, // Constant Current (CC)
CURVE_OCP = 0x08, // Open Circuit Potential (OCP)
CURVE_CV = 0x09, // Cyclic Voltammetry (CV) //0xC0,
CURVE_LSV = 0x0A, // Linear Sweep Voltammetry (LSV) //0x02,
CURVE_CA = 0x0B, // Chronoamperometric Graph (CA) //0x03,
CURVE_PULSE = 0x0C, //0x94,
CURVE_UNI_PULSE = 0x0D, // universal pulse
CURVE_DPV = 0x0E,
CURVE_CV = 0x09, // Cyclic Voltammetry (CV)
CURVE_LSV = 0x0A, // Linear Sweep Voltammetry (LSV)
CURVE_CA = 0x0B, // Chronoamperometric Graph (CA)
CURVE_CP = 0x0C,
CURVE_UNI_PULSE = 0x0D, // Pulse Sensing (universal pulse)
CURVE_DPV = 0x0E, // Differential Pulse Voltammetry (DPV)
CURVE_DPV_SMPRATE = 0x0F,
CURVE_DPV_ADVANCE = 0x10,
CURVE_DPV_ADVANCE_SMPRATE = 0x11,
CURVE_CALI_ADC = 0xF1, // Cali ADC - test //0x92,
CURVE_CALI = 0xF1,
SET_SAMPLE_RATE = 0xE0, //0x70,
SET_ADC_DAC_GAIN = 0xE1, //0x80,
SET_SAMPLE_RATE = 0xE0,
SET_ADC_DAC_GAIN = 0xE1,
SET_PARA = 0xE2
};
@@ -82,19 +81,15 @@ enum dev_para_e {
#define COLOR_CYAN 0x06
#define COLOR_MAGENTA 0x07
#define COLOR_PURPLE 0x08
#define COLOR_WHITE 0x09
#define COLOR_WHITE 0x09
#define COLOR_YELLOWGREEN 0x0A
#define COLOR_EMERALD 0x0B
#define COLOR_YELLOW_DARK 0xF3
#define COLOR_GREEN_DARK 0xF4
#define COLOR_BLUE_DARK 0xF5
#define COLOR_CYAN_DARK 0xF6
#define COLOR_PURPLE_DARK 0xF8
#define LEDPowerON() Elite_led_color(COLOR_GREEN)
#define WORKLED() Elite_led_color(COLOR_CYAN)
#define KEYLED() Elite_led_color(COLOR_YELLOW)
#define BT_WAIT_LED() Elite_led_color(COLOR_YELLOWGREEN)
#define BT_WAIT 0x01
#define NO_EVENT 0x02
@@ -23,8 +23,7 @@ static void volt_out() {
instru.VoltConstant = instru.Vout / 40000 + 25000; //5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLv, instru.VoltConstant);
DAC_outputV(DACOutCode);
DAC0_W_T(DACOutCode);
return;
}
@@ -46,8 +45,7 @@ static void vscan_volt_out(void)
instru.VoltConstant = instru.Vout / 40000 + 25000;//5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLv, instru.VoltConstant);
DAC_outputV(DACOutCode);
DAC0_W_T(DACOutCode);
return;
}
@@ -67,7 +65,7 @@ static void CalcuResistance()
int64_t current = (int64_t)(m->_measureCurrent);
resist = volt * 1000000 / current; //R = V / Iin; [mOhm]
InputNotify(NOTIFY_IMPEDANCE, resist);
InputNotify(NOTIFY_CH3, resist);
}
static void DACenable(uint8_t afterRead){
@@ -80,6 +78,11 @@ static void DACenable(uint8_t afterRead){
volt_out();
break;
case CURVE_CP:
cp_vscan();
volt_out();
break;
case CURVE_UNI_PULSE:
volt_out();
break;
@@ -127,18 +130,18 @@ static void DACenable(uint8_t afterRead){
*/
#define CNT_TO_I_GAIN_3M_IIN_VIN_VOUT_PLOT 7 // 7 * 12ms = 84ms
#define CNT_TO_I_GAIN_100K_IIN_VIN_VOUT_PLOT 2 // 2 * 12ms = 24ms
#define CNT_TO_I_GAIN_3K_IIN_VIN_VOUT_PLOT 1 // 1 * 12ms = 12ms
#define CNT_TO_I_GAIN_100R_IIN_VIN_VOUT_PLOT 1 // 1 * 12ms = 12ms
#define CNT_TO_I_GAIN_3K_IIN_VIN_VOUT_PLOT 5 // 5 * 12ms = 60ms
#define CNT_TO_I_GAIN_100R_IIN_VIN_VOUT_PLOT 5 // 5 * 12ms = 60ms
#define CNT_TO_I_GAIN_3M_IIN_VIN_PLOT 10 // 10 * 8ms = 80ms
#define CNT_TO_I_GAIN_100K_IIN_VIN_PLOT 3 // 3 * 8ms = 24ms
#define CNT_TO_I_GAIN_3K_IIN_VIN_PLOT 2 // 2 * 8ms = 16ms
#define CNT_TO_I_GAIN_100R_IIN_VIN_PLOT 2 // 2 * 8ms = 16ms
#define CNT_TO_I_GAIN_3K_IIN_VIN_PLOT 5 // 5 * 8ms = 40ms
#define CNT_TO_I_GAIN_100R_IIN_VIN_PLOT 5 // 5 * 8ms = 40ms
#define CNT_TO_I_GAIN_3M_IT_PLOT 20 // 20 * 4ms = 80ms
#define CNT_TO_I_GAIN_100K_IT_PLOT 5 // 5 * 4ms = 20ms
#define CNT_TO_I_GAIN_3K_IT_PLOT 3 // 3 * 4ms = 12ms
#define CNT_TO_I_GAIN_100R_IT_PLOT 3 // 3 * 4ms = 12ms
#define CNT_TO_I_GAIN_3K_IT_PLOT 5 // 5 * 4ms = 20ms
#define CNT_TO_I_GAIN_100R_IT_PLOT 5 // 5 * 4ms = 20ms
static void read_Iin_change_gain(uint16_t plot_type)
{
@@ -156,8 +159,8 @@ static void read_Iin_change_gain(uint16_t plot_type)
if (instru.IinADCAutoGainEn > 1)
return;
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_CURR(wm) = DecodeADCValue(instru.IinADCGainLv, RIS_ADC_IIN, spi_ADC_rxbuf);
ADC_rxbuf = MEASURE_CURRENT();
MEAS_CURR(wm) = DecodeADCValue(instru.IinADCGainLv, RIS_ADC_IIN, ADC_rxbuf);
if (instru.IinADCAutoGainEn) {
AutoGainChangeIin(MEAS_CURR(wm), plot, &no_rec_time);
@@ -225,8 +228,8 @@ static void read_Vin_change_gain(void)
return;
/* read Vin and do NOT record the Vin after changing gain twice */
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_VIN(wm) = DecodeADCValue(instru.VinADCGainLv, RIS_ADC_VIN, spi_ADC_rxbuf);
ADC_rxbuf = MEASURE_VOLT();
MEAS_VIN(wm) = DecodeADCValue(instru.VinADCGainLv, RIS_ADC_VIN, ADC_rxbuf);
if (instru.VinADCAutoGainEn) {
AutoGainChangeVin(MEAS_VIN(wm));
} else {
@@ -253,8 +256,8 @@ static void read_Vout_change_gain(void)
void *wm = wm_get();
/* read Vout and do NOT record the Vout after changing gain twice */
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_VOUT(wm) = DecodeADCValue(0, RIS_ADC_VOUT, spi_ADC_rxbuf);
ADC_rxbuf = MEASURE_DAC();
MEAS_VOUT(wm) = DecodeADCValue(0, RIS_ADC_VOUT, ADC_rxbuf);
if (volt_rec_en == false) {
rec_cnt++;
@@ -271,9 +274,9 @@ static void read_Vout_change_gain(void)
void EliteCalcAvg(uint32_t time)
{
struct wm_uni_pulse_ctx_t *p = (struct wm_uni_pulse_ctx_t *)wm_get();
struct wm_meas_t *meas = &p->measure;
static uint32_t cnt = 0;
static int64_t curr_sum = 0;
void *wm = wm_get();
int64_t curr_avg = 0;
uint32_t m;
uint32_t t = time;
@@ -282,7 +285,7 @@ void EliteCalcAvg(uint32_t time)
if (calc_avg_en) {
cnt++;
curr_sum = curr_sum + meas->_measureCurrent;
curr_sum = curr_sum + MEAS_CURR(wm);
} else {
curr_avg = curr_sum / cnt;
@@ -292,11 +295,11 @@ void EliteCalcAvg(uint32_t time)
}
if (m < p->_t_pa[0]) {
InputNotify(NOTIFY_CURRENT, curr_avg);
InputNotify(NOTIFY_CH1, curr_avg);
SendNotify();
} else if (m < p->_t_pa[1]) {
InputNotify(NOTIFY_VOLT, curr_avg);
InputNotify(NOTIFY_CH2, curr_avg);
SendNotify();
} else if (m < p->_t_pa[2]) {
@@ -317,9 +320,9 @@ void EliteCalcAvg(uint32_t time)
void dpv_EliteCalcAvg(uint32_t time)
{
struct wm_dpv_ctx_t *p = (struct wm_dpv_ctx_t *)wm_get();
struct wm_meas_t *meas = &p->measure;
static uint32_t cnt = 0;
static int64_t curr_sum = 0;
void *wm = wm_get();
int64_t curr_avg = 0;
uint32_t m;
uint32_t t = time;
@@ -329,10 +332,10 @@ void dpv_EliteCalcAvg(uint32_t time)
if (calc_avg_en) {
cnt++;
curr_sum = curr_sum + meas->_measureCurrent;
curr_sum = curr_sum + MEAS_CURR(wm);
if (first_v_rec) {
InputNotify(NOTIFY_VOLT, instru.Vout/200 - meas->_measureVin);
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
InputNotify(NOTIFY_CH2, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
first_v_rec = false;
}
@@ -345,11 +348,11 @@ void dpv_EliteCalcAvg(uint32_t time)
}
if (m < p->_t_pa[0]) {
InputNotify(NOTIFY_CURRENT, curr_avg);
InputNotify(NOTIFY_CH1, curr_avg);
SendNotify();
} else if (m < p->_t_pa[1]) {
InputNotify(NOTIFY_CURRENT, curr_avg);
InputNotify(NOTIFY_CH1, curr_avg);
SendNotify();
} else if (m < p->_t_pa[2]) {
@@ -370,9 +373,9 @@ void dpv_EliteCalcAvg(uint32_t time)
void dpv_advance_EliteCalcAvg(uint32_t time)
{
struct wm_dpv_advance_ctx_t *p = (struct wm_dpv_advance_ctx_t *)wm_get();
struct wm_meas_t *meas = &p->measure;
static uint32_t cnt = 0;
static int64_t curr_sum = 0;
void *wm = wm_get();
int64_t curr_avg = 0;
uint32_t m;
uint32_t t = time;
@@ -382,10 +385,10 @@ void dpv_advance_EliteCalcAvg(uint32_t time)
if (calc_avg_en) {
cnt++;
curr_sum = curr_sum + meas->_measureCurrent;
curr_sum = curr_sum + MEAS_CURR(wm);
if (first_v_rec) {
InputNotify(NOTIFY_VOLT, instru.Vout/200 - meas->_measureVin);
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
InputNotify(NOTIFY_CH2, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
first_v_rec = false;
}
@@ -398,11 +401,11 @@ void dpv_advance_EliteCalcAvg(uint32_t time)
}
if (m < p->_t_pa[0]) {
InputNotify(NOTIFY_CURRENT, curr_avg);
InputNotify(NOTIFY_CH1, curr_avg);
SendNotify();
} else if (m < p->_t_pa[1]) {
InputNotify(NOTIFY_CURRENT, curr_avg);
InputNotify(NOTIFY_CH1, curr_avg);
SendNotify();
} else if (m < p->_t_pa[2]) {
@@ -431,7 +434,7 @@ static void Iin_Vin_Vout_Plot(uint32_t time)
if (batteryCheck_flag && tempCheck_flag) {
read_adc_flag = EliteADCBattery();
if (!read_adc_flag) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt = 5;
}
@@ -463,7 +466,7 @@ static void Iin_Vin_Vout_Plot(uint32_t time)
ADC_cnt++;
} else if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_VOLT();
ADC_cnt++;
} else if (ADC_cnt == 2) {
@@ -472,7 +475,7 @@ static void Iin_Vin_Vout_Plot(uint32_t time)
ADC_cnt++;
} else if (ADC_cnt == 3) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_DAC();
ADC_cnt++;
} else if (ADC_cnt == 4) {
@@ -481,7 +484,7 @@ static void Iin_Vin_Vout_Plot(uint32_t time)
ADC_cnt++;
} else if (ADC_cnt == 5) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt = 0;
}
@@ -498,7 +501,7 @@ static void Iin_Vin_Plot(void)
if (batteryCheck_flag && tempCheck_flag) {
read_adc_flag = EliteADCBattery();
if (!read_adc_flag) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt = 3;
}
@@ -519,7 +522,7 @@ static void Iin_Vin_Plot(void)
ADC_cnt++;
} else if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_VOLT();
ADC_cnt++;
} else if (ADC_cnt == 2) {
@@ -528,7 +531,7 @@ static void Iin_Vin_Plot(void)
ADC_cnt++;
} else if (ADC_cnt == 3) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt = 0;
}
@@ -549,7 +552,7 @@ static void IT_Plot(uint32_t time)
if (batteryCheck_flag || tempCheck_flag) {
read_adc_flag = EliteADCBattery();
if (!read_adc_flag) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt = 1;
}
@@ -560,7 +563,7 @@ static void IT_Plot(uint32_t time)
* 1 - read Iin and reset ADC_cnt
*/
if (ADC_cnt == 0) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt++;
return;
@@ -592,7 +595,7 @@ static void VT_Plot(void)
if (batteryCheck_flag && tempCheck_flag) {
EliteADCBattery();
if (!batteryCheck_flag) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_VOLT();
ADC_cnt = 1;
}
@@ -603,7 +606,7 @@ static void VT_Plot(void)
* 1 - read Vin and reset ADC_cnt
*/
if (ADC_cnt == 0) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_VOLT();
ADC_cnt++;
return;
@@ -629,7 +632,7 @@ static void Vout_Plot(void)
if (batteryCheck_flag && tempCheck_flag) {
EliteADCBattery();
if (!batteryCheck_flag) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_DAC();
ADC_cnt = 1;
}
@@ -640,7 +643,7 @@ static void Vout_Plot(void)
* 1 - read Vout and reset ADC_cnt
*/
if (ADC_cnt == 0) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_DAC();
ADC_cnt++;
return;
@@ -660,8 +663,6 @@ static void Vout_Plot(void)
static void cali_IT_plot(void) {
void *wm = wm_get();
static int32_t ADCValueSUM = 0;
static uint16_t cali_count = 0;
static uint8_t ADC_cnt = 0;
static uint8_t rec_cnt = 0;
static uint16_t cali_count_max = 1000;
@@ -675,8 +676,8 @@ static void cali_IT_plot(void) {
if (instru.IinADCAutoGainEn) {
MEAS_CURR(wm) = 0xFFFF;
} else {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_CURR(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
ADC_rxbuf = MEASURE_CURRENT();
MEAS_CURR(wm) = (int32_t) ADC_rxbuf;
if (lastIinADCGainLevel != instru.IinADCGainLv) {
IinADCGainCtrl(instru.IinADCGainLv);
}
@@ -691,10 +692,10 @@ static void cali_IT_plot(void) {
if (curr_rec_en == false) {
rec_cnt++;
} else {
if (cali_count >= cali_count_max) {
ADCValueAVG = ADCValueSUM / cali_count;
if (GET_CALI_COUNT(wm) >= cali_count_max) {
ADCValueAVG = GET_ADC_SUM(wm) / GET_CALI_COUNT(wm);
InputNotify(NOTIFY_CURRENT, ADCValueAVG);
InputNotify(NOTIFY_CH1, ADCValueAVG);
SendNotify();
uint8_t CIS_buf[9] = {0};
@@ -707,19 +708,19 @@ static void cali_IT_plot(void) {
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
PeriodicEvent = false;
ADCValueSUM = 0;
cali_count = 0;
ModeLED(NO_EVENT);
} else {
cali_count++;
ADCValueSUM = ADCValueSUM + MEAS_CURR(wm);
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_VOLT, ADCValueSUM);
InputNotify(NOTIFY_IMPEDANCE, (int32_t)cali_count);
GET_CALI_COUNT(wm)++;
GET_ADC_SUM(wm) = GET_ADC_SUM(wm) + MEAS_CURR(wm);
ADCValueAVG = GET_ADC_SUM(wm) / GET_CALI_COUNT(wm);
InputNotify(NOTIFY_CH1, ADCValueAVG);
InputNotify(NOTIFY_CH2, MEAS_CURR(wm));
InputNotify(NOTIFY_CH3, (int32_t)GET_CALI_COUNT(wm));
}
}
if (rec_cnt == 2) {
volt_rec_en = true;
curr_rec_en = true;
rec_cnt = 0;
}
@@ -729,14 +730,14 @@ static void cali_IT_plot(void) {
}
if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt++;
return;
}
if (ADC_cnt == 2) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_CURRENT();
ADC_cnt = 0;
return;
@@ -748,8 +749,6 @@ static void cali_IT_plot(void) {
static void cali_VT_plot(void) {
void *wm = wm_get();
static int32_t ADCValueSUM = 0;
static uint16_t cali_count = 0;
static uint8_t ADC_cnt = 0;
static uint8_t rec_cnt = 0;
uint16_t cali_count_max = 0;
@@ -763,8 +762,8 @@ static void cali_VT_plot(void) {
if (instru.VinADCAutoGainEn) {
MEAS_VIN(wm) = 0xFFFF;
} else {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_VIN(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
ADC_rxbuf = MEASURE_VOLT();
MEAS_VIN(wm) = (int32_t) ADC_rxbuf;
if (lastVinADCGainLv != instru.VinADCGainLv) VinADCGainCtrl(instru.VinADCGainLv);
}
@@ -777,10 +776,10 @@ static void cali_VT_plot(void) {
if (volt_rec_en == false) {
rec_cnt++;
} else {
if (cali_count >= cali_count_max) {
ADCValueAVG = ADCValueSUM / cali_count;
if (GET_CALI_COUNT(wm) >= cali_count_max) {
ADCValueAVG = GET_ADC_SUM(wm) / GET_CALI_COUNT(wm);
InputNotify(NOTIFY_VOLT, ADCValueAVG);
InputNotify(NOTIFY_CH2, ADCValueAVG);
SendNotify();
uint8_t CIS_buf[9] = {0};
@@ -793,20 +792,21 @@ static void cali_VT_plot(void) {
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
PeriodicEvent = false;
ADCValueSUM = 0;
cali_count = 0;
ModeLED(NO_EVENT);
} else {
cali_count++;
ADCValueSUM = ADCValueSUM + MEAS_VIN(wm);
InputNotify(NOTIFY_VOLT, MEAS_VIN(wm));
InputNotify(NOTIFY_CURRENT, ADCValueSUM);
InputNotify(NOTIFY_IMPEDANCE, (int32_t)cali_count);
GET_CALI_COUNT(wm)++;
GET_ADC_SUM(wm) = GET_ADC_SUM(wm) + MEAS_VIN(wm);
ADCValueAVG = GET_ADC_SUM(wm) / GET_CALI_COUNT(wm);
InputNotify(NOTIFY_CH2, MEAS_VIN(wm));
InputNotify(NOTIFY_CH1, ADCValueAVG);
InputNotify(NOTIFY_CH3, (int32_t)GET_CALI_COUNT(wm));
}
}
if (rec_cnt == 2) {
volt_rec_en = true;
curr_rec_en = true;
rec_cnt = 0;
}
ADC_cnt++;
@@ -815,14 +815,14 @@ static void cali_VT_plot(void) {
}
if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_VOLT();
ADC_cnt++;
return;
}
if (ADC_cnt == 2) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_VOLT();
ADC_cnt = 0;
return;
@@ -830,58 +830,50 @@ static void cali_VT_plot(void) {
return;
}
static void count_sum_clear(void) {
void *wm = wm_get();
if(wm) {
GET_CALI_COUNT(wm) = 0;
GET_ADC_SUM(wm) = 0;
}
return;
}
static void cali_Vout_plot(void) {
void *wm = wm_get();
static int32_t ADCValueSUM = 0;
static uint16_t cali_count = 0;
static uint8_t ADC_cnt = 0;
static uint8_t rec_cnt = 0;
uint16_t cali_count_max = 1000;
uint16_t cali_count_max = 2000;
int32_t ADCValueAVG = 0;
/* ADC_cnt: 0 - read Vin and do NOT buffer the Vin after changing gain twice
* 1 - read Vin and increase ADC_cnt
* 2 - read Vin and reset ADC_cnt
*/
if(vscanReset)
return;
if (ADC_cnt == 0) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_VOUT(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
ADC_rxbuf = MEASURE_DAC();
MEAS_VOUT(wm) = (int32_t) ADC_rxbuf;
if (volt_rec_en == false) {
rec_cnt++;
} else {
if (cali_count >= cali_count_max) {
ADCValueAVG = ADCValueSUM / cali_count;
InputNotify(NOTIFY_VOLT, ADCValueAVG);
SendNotify();
GET_CALI_COUNT(wm)++;
GET_ADC_SUM(wm) = GET_ADC_SUM(wm) + MEAS_VOUT(wm);
ADCValueAVG = GET_ADC_SUM(wm) / GET_CALI_COUNT(wm);
InputNotify(NOTIFY_CH2, MEAS_VOUT(wm));
InputNotify(NOTIFY_CH1, ADCValueAVG);
InputNotify(NOTIFY_CH3, (int32_t)GET_CALI_COUNT(wm));
uint8_t CIS_buf[9] = {0};
CIS_buf[0] = 5; //data len
CIS_buf[1] = instru.chip_id;
CIS_buf[2] = (uint8_t) ((ADCValueAVG & 0xFF00) >> 8);
CIS_buf[3] = (uint8_t) (ADCValueAVG & 0x00FF);
CIS_buf[4] = 0x00;
CIS_buf[5] = instru.VinADCGainLv;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
PeriodicEvent = false;
ADCValueSUM = 0;
cali_count = 0;
ModeLED(NO_EVENT);
} else {
cali_count++;
ADCValueSUM = ADCValueSUM + MEAS_VOUT(wm);
InputNotify(NOTIFY_VOLT, MEAS_VOUT(wm));
InputNotify(NOTIFY_CURRENT, ADCValueSUM);
InputNotify(NOTIFY_IMPEDANCE, (int32_t)cali_count);
}
}
if (rec_cnt == 2) {
volt_rec_en = true;
curr_rec_en = true;
rec_cnt = 0;
}
ADC_cnt++;
@@ -890,14 +882,14 @@ static void cali_Vout_plot(void) {
}
if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_DAC();
ADC_cnt++;
return;
}
if (ADC_cnt == 2) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_rxbuf = MEASURE_DAC();
ADC_cnt = 0;
return;
@@ -1,9 +0,0 @@
#ifndef HEADSTAGE_POWER_H
#define HEADSTAGE_POWER_H
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26XX.h>
#define headstage_power_shutdown() Power_shutdown(NULL, 0)
#endif // HEADSTAGE_POWER_H
@@ -2,11 +2,11 @@
#ifndef VERSION_DATE
#define VERSION_DATE
#define VERSION_DATE_YEAR 22
#define VERSION_DATE_MONTH 4
#define VERSION_DATE_DAY 13
#define VERSION_DATE_HOUR 14
#define VERSION_DATE_MINUTE 16
#define VERSION_DATE_YEAR 23
#define VERSION_DATE_MONTH 3
#define VERSION_DATE_DAY 7
#define VERSION_DATE_HOUR 17
#define VERSION_DATE_MINUTE 41
// this is NOT the version hash !!
// it's the last version hash
@@ -420,38 +420,7 @@ characteristic change event
/*===================================
==== headstage general variable ====
==================================*/
// Internal Events for RTOS application
#ifndef RTOSPARA
#define RTOSPARA
#define SBP_STATE_CHANGE_EVT 0x0001
#define SBP_CHAR_CHANGE_EVT 0x0002
#define SBP_PERIODIC_EVT 0x0004
#define SBP_CONN_EVT_END_EVT 0x0008
#define SBP_KEY_CHANGE_EVT 0x0010
#endif
/**************************
controller version
EliteZM02 0,2,1,5
EliteZM15 0,2,1,6
EliteZM_pulsefly 0,2,1,7
**************************/
// product information
#define DEVICE_NAME "Elite-EDC"
#define MAJOR_PRODUCT_NUMBER 0 // 0:Elite, 1:Neulive
#define MINOR_PRODUCT_NUMBER 2 // 1:Elite_legacy(Ori_Neulive) 2:Elite_zm 3:Elite_bat
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 6
#define ELITE_VERSION_1_4
// buffer size
#define BLE_CIS_BUFF_CHAR SIMPLEPROFILE_CHAR2
#define BLE_INS_BUFF_CHAR SIMPLEPROFILE_CHAR3
#define BLE_DAT_BUFF_CHAR SIMPLEPROFILE_CHAR4
#define BLE_CIS_BUFF_SIZE SIMPLEPROFILE_CHAR2_LEN
#define BLE_INS_BUFF_SIZE SIMPLEPROFILE_CHAR3_LEN
#define BLE_DAT_BUFF_SIZE SIMPLEPROFILE_CHAR4_LEN
enum send_ins_para_order_e {
PARA_1 = 0x01,
@@ -474,6 +443,15 @@ enum send_ins_para_order_e {
PARA_FINAL = 0xFF,
};
enum dev_led_item_e {
DEV_LED_LIMIT_COLOR = 0,
DEV_LED_DARK_COLOR,
DEV_LED_LIGHT_COLOR,
DEV_LED_RAINBOW,
DEV_LED_MAX,
};
#define UC_TO_5NV(_v) (_v - 25000) * 4 * 10000; //userode to 5nv per unit
#include "Elite_def.h"
@@ -487,26 +465,9 @@ static uint8_t ins_buf[BLE_INS_BUFF_SIZE] = {0};
static uint8_t not_buf[BLE_DAT_BUFF_SIZE] = {0};
static uint8_t cis_buf[BLE_CIS_BUFF_SIZE] = {0};
/**
* Latch initialize
*/
#define LATCH_BUFF_SIZE 8 // define latch
struct _LH{
bool LATCH0[LATCH_BUFF_SIZE];
bool LATCH1[LATCH_BUFF_SIZE];
bool LATCH2[LATCH_BUFF_SIZE];
uint8_t LoadState;
} LH= {0};
static void InitLH();
static void Init_Elite15_PIN();
static Clock_Struct periodicClock;
static bool PeriodicEvent = false;
static bool InitPeriodicEvent = true;
static bool megaStiEnable = false;
static ICall_Semaphore semaphore;
static uint16_t events;
/*=====================================
==== headstage function prototype ====
@@ -514,7 +475,7 @@ static uint16_t events;
/**
* ZM function
*/
static void ZM_init();
static void device_init(void);
/**
* update the instruction buffer major content.
@@ -565,26 +526,25 @@ static bool first_highz_flag;
static bool tempCheck_flag;
static bool calc_avg_en;
static uint16_t dpv_step_cnt = 0;
// cp mode use
static int16_t cp_devis = 0;
static bool cp_devis_en = FALSE;
//pulse mode variable
static bool stiFirstTime;
static uint8_t lastVinADCGainLv;
static uint8_t lastIinADCGainLevel;
static void update_latch_status (uint32_t latch_num, uint32_t elite_pin, bool highlow);
// static void update_latch_status (uint32_t latch_num, uint32_t elite_pin, bool highlow);
// ADC function
static void headstage_battery_volt();
static bool EliteADCBattery();
static void VinADCGainCtrl(uint8_t VinADCLevel);
static void VoutGainControl(uint8_t VOUTLevel);
static void PIN15_setOutputValue (uint32_t latch_num, uint32_t pin_num, bool highlow);
// Elite key detection & turn on/ shutdown function (peripheral hardware control)
static void Elite_led_color(uint16_t color);
static void ModeLED(uint16_t modeStatus);
static bool If10Von = false;
static void TurnOn10V();
// periodic event control
static void EliteADCControl(uint32_t time);
@@ -596,6 +556,7 @@ static void lsv_vscan(void);
static void ca_vscan(void);
static void cv_vscan(void);
static void cc_vscan(void);
static void cp_vscan(void);
//mode (DAC)
static void DACenable(uint8_t afterRead);
@@ -605,31 +566,18 @@ static void pulse_vscan(void);
//mode (notify)
static void initDATBuf();
#include "EliteNotify.h"
#include "EliteADC.h"
#include "EliteInstruction.h"
#include "EliteDAC.h"
#include "EliteSPI.h"
#include "Elite_PIN.h"
#include "Elite15_PIN.h"
#ifdef ELITE_VERSION_1_4
#include "EliteI2C.h"
#endif
#include "EliteDeviceCorrection.h"
#include "EliteNotify.h"
#include "EliteFlagCTInit.h"
#include "EliteLatchInit.h"
#include "EliteReset.h"
#include "EliteLED.h"
#include "EliteKeyDetect.h"
#include "Elite_mode_ADC_DAC.h"
#include "scan_volt.h"
#include "impedance_meter.h"
#include "Elite_version.h"
#include "Elite_batt.h"
#include "Elite_power.h"
// update instruction for Z meter
static void update_ZM_instruction(uint8 *ins) {
@@ -650,14 +598,13 @@ static void update_ZM_instruction(uint8 *ins) {
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.steptime = (uint32_t)(ins[9]);
instru.steptime = OldStep2NewStepTime(instru.steptime); //5000;10000;20000;
instru.steptime = get_step_time(ins[9]); //5000;10000;20000;
instru.step = ((uint32_t)(ins[7]) << 8) | (uint32_t)(ins[8]);//1~1000 = 0.1mv ~ 100mv
instru.step = instru.step * 100000 / instru.steptime;
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = 1;
instru.hign_z_en = ~(ins[11] & 0x0F);
instru.hign_z_en = ins[11] & 0x0F;
instru.notifyRate = ((uint32_t)ins[12] << 8) | (uint32_t)ins[13];
instru.notifyRate = 10000 / instru.notifyRate * 10;
@@ -681,14 +628,13 @@ static void update_ZM_instruction(uint8 *ins) {
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.steptime = (uint32_t)(ins[9]);
instru.steptime = OldStep2NewStepTime(instru.steptime); //5000;10000;20000;
instru.steptime = get_step_time(ins[9]); //5000;10000;20000;
instru.step = ((uint32_t)(ins[7]) << 8) | (uint32_t)(ins[8]);//1~1000 = 0.1mv ~ 100mv
instru.step = instru.step * 100000 / instru.steptime;
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = ((uint16_t)(ins[10]) << 8) | (uint16_t)(ins[11]);
instru.hign_z_en = ~(ins[13] & 0x0F);
instru.hign_z_en = ins[13] & 0x0F;
instru.notifyRate = ((uint32_t)ins[14] << 8) | (uint32_t)ins[15];
instru.notifyRate = 10000 / instru.notifyRate * 10;
@@ -705,10 +651,10 @@ static void update_ZM_instruction(uint8 *ins) {
}
case CURVE_VO: {
instru.eliteFxn = CURVE_VO;
instru.eliteFxn = CURVE_VO; //0x3000037530000103E8
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
instru.hign_z_en = ~(ins[6] & 0x0F);
instru.hign_z_en = ins[6] & 0x0F;
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
instru.VoutGainLv = VOUT_GAIN_15K;
@@ -731,7 +677,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.VsetRate = 2;
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
instru.hign_z_en = ~(ins[6] & 0x0F);
instru.hign_z_en = ins[6] & 0x0F;
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
instru.VoutGainLv = VOUT_GAIN_15K;
@@ -748,7 +694,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.eliteFxn = CURVE_VT;
instru.notifyRate = ((uint32_t)ins[5] << 8) | (uint32_t)ins[6];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.hign_z_en = ~(ins[4] & 0x0F);
instru.hign_z_en = ins[4] & 0x0F;
ModeLED(WORKING);
@@ -761,7 +707,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
instru.hign_z_en = ~(ins[6] & 0x0F);
instru.hign_z_en = ins[6] & 0x0F;
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
instru.VoutGainLv = VOUT_GAIN_15K;
@@ -782,7 +728,33 @@ static void update_ZM_instruction(uint8 *ins) {
instru.constantCurrent = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
instru.Vmax = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.Vmin = (uint32_t)(ins[10]) << 8 | (uint32_t)(ins[11]);
instru.hign_z_en = ~(ins[13] & 0x0F);
instru.hign_z_en = ins[13] & 0x0F;
// instru.cc_resistance = ins[16] & 0xF0; // 0:vout has 0R 1:vout has 100R
instru.cc_cp_speed = ins[16] & 0x0F; // 0:low 1:normal 2:high
instru.VoutGainLv = VOUT_GAIN_240K;
ModeLED(WORKING);
/*******************************************************
controller instruction
ins[3] -> Charge, 0:discharge 1:charge
ins[6:9] -> ConstantCurrent, 0 ~ 15000uA : 0 ~ 1500000
********************************************************/
break;
}
case CURVE_CP: { //vscan's cc
instru.eliteFxn = CURVE_CP;
instru.notifyRate = ((uint32_t)ins[14] << 8) | (uint32_t)ins[15];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.charge = ins[3]; //0:discharge 1:charge
instru.constantCurrent = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
instru.Vmax = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.Vmin = (uint32_t)(ins[10]) << 8 | (uint32_t)(ins[11]);
instru.hign_z_en = ins[13] & 0x0F;
// instru.cc_resistance = ins[16] & 0xF0; // 0:vout has 0R 1:vout has 100R
instru.cc_cp_speed = ins[16] & 0x0F; // 0:low 1:normal 2:high
instru.VoutGainLv = VOUT_GAIN_240K;
@@ -821,7 +793,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.cycleNumber = ((uint16_t)(ins[4]) << 8) | (uint16_t)(ins[5]);
instru.notifyRate = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.hign_z_en = ~(ins[7] & 0x0F);
instru.hign_z_en = ins[7] & 0x0F;
instru.VoutGainLv = VOUT_GAIN_240K;
ModeLED(WORKING);
@@ -850,7 +822,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.eliteFxn = CURVE_LSV;
instru.notifyRate = (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.hign_z_en = ~(ins[5] & 0x0F);
instru.hign_z_en = ins[5] & 0x0F;
instru.VoutGainLv = VOUT_GAIN_240K;
@@ -866,7 +838,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.notifyRate = (uint32_t)(ins[7]) << 8 | (uint32_t)(ins[8]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.VsetRate = VsetRateTable[0];
instru.hign_z_en = ~(ins[6] & 0x0F);
instru.hign_z_en = ins[6] & 0x0F;
instru.VoutGainLv = VOUT_GAIN_240K;
@@ -878,7 +850,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.eliteFxn = CURVE_OCP;
instru.notifyRate = ((uint32_t)ins[5] << 8) | (uint32_t)ins[6];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.hign_z_en = 0;
instru.hign_z_en = ins[4] & 0x0F;;
ModeLED(WORKING);
@@ -917,10 +889,6 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case RIS_DAC_VOUT : {
// instru.VoutGainLv = ins[4];
// if(instru.VoutGainLv == VOUT_GAIN_AUTO){
// instru.VoutGainLv = VOUT_GAIN_15K;
// }
instru.VoutGainLv = ins[4];
VoutGainControl(instru.VoutGainLv);
break;
@@ -928,11 +896,18 @@ static void update_ZM_instruction(uint8 *ins) {
case RIS_HIGH_Z : {
switch(ins[4]) {
case 0x00 : {
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0 => open high_z mode
if (PeriodicEvent) {
//latch_single_ctrl(E_LATCH_HIGH_Z, 0); // 0 => open high_z mode
HIGH_Z_OPEN();
}
break;
}
case 0x01 : {
PIN15_setOutputValue(HIGH_Z_MODE, 1); // 1 => close high_z mode
if (PeriodicEvent) {
//latch_single_ctrl(E_LATCH_HIGH_Z, 1); // 1 => close high_z mode
HIGH_Z_CLOSE();
}
break;
}
default : {
@@ -948,29 +923,50 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case CURVE_CALI_ADC: {
case CURVE_CALI: {
switch(ins[3]) {
case RIS_ADC_IIN : { // 0x00
instru.eliteFxn = CURVE_CALI_ADC;
instru.eliteFxn = CURVE_CALI;
instru.AdcChannel = RIS_ADC_IIN;
instru.notifyRate = 1000;
ModeLED(WORKING);
break;
}
case RIS_ADC_VIN : { // 0x01
instru.eliteFxn = CURVE_CALI_ADC;
instru.eliteFxn = CURVE_CALI;
instru.AdcChannel = RIS_ADC_VIN;
instru.notifyRate = 1000;
ModeLED(WORKING);
break;
}
case RIS_DAC_VOUT : { // 0x02
instru.eliteFxn = CURVE_CALI_ADC;
instru.eliteFxn = CURVE_CALI;
instru.AdcChannel = RIS_DAC_VOUT;
instru.notifyRate = 1000;
instru.VoltConstant = ( ((uint16_t)(ins[4])) << 8) | (uint16_t)(ins[5]); // output voltage
DAC_outputV(instru.VoltConstant); //UserCode -> DAC code -> DAC out
instru.hign_z_en = 1;
switch(ins[4]) {
case 0x00: {
instru.VoltConstant = 0x2710;
break;
}
case 0x01: {
instru.VoltConstant = 0x61A8;
break;
}
case 0x02: {
instru.VoltConstant = 0xC350;
break;
}
case 0x03: {
instru.VoltConstant = 0xEA60;
break;
}
}
DAC0_W_T(instru.VoltConstant);
ModeLED(WORKING);
count_sum_clear();
break;
}
default : {
@@ -980,44 +976,6 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case CURVE_PULSE: {
instru.VoutGainLv = VOUT_GAIN_240K;
instru.notifyRate = 100;
if (ins[3] == PARA_1) {
instru.sti_t1 = (int32_t)(ins[4]) << 24 | (int32_t)(ins[5]) << 16 | (int32_t)(ins[6]) << 8 | (int32_t)(ins[7]);
instru.sti_t2 = (int32_t)(ins[8]) << 24 | (int32_t)(ins[9]) << 16 | (int32_t)(ins[10]) << 8 | (int32_t)(ins[11]);
instru.sti_t3 = (int32_t)(ins[12]) << 24 | (int32_t)(ins[13]) << 16 | (int32_t)(ins[14]) << 8 | (int32_t)(ins[15]);
instru.sti_t4 = (int32_t)(ins[16]) << 24 | (int32_t)(ins[17]) << 16 | (int32_t)(ins[18]) << 8 | (int32_t)(ins[19]);
} else if (ins[3] == PARA_2) {
instru.sti_t5 = (int32_t)(ins[4]) << 24 | (int32_t)(ins[5]) << 16 | (int32_t)(ins[6]) << 8 | (int32_t)(ins[7]);
instru.sti_v1 = 25000; //8~11
instru.sti_v2 = 50000; //12~15 //41406.43161.
instru.sti_v3 = 25000; //16~19
} else if (ins[3] == PARA_3) {
instru.sti_v4 = 25000; //4~7
instru.sti_v5 = 25000; //8~11
instru.sti_cy = (uint16_t)(ins[12]); //12
instru.sti_loop = (uint16_t)(ins[13]); //13
} else if (ins[3] == PARA_4) {
instru.sti_t6 = (int32_t)(ins[4]) << 24 | (int32_t)(ins[5]) << 16 | (int32_t)(ins[6]) << 8 | (int32_t)(ins[7]); //4~7
instru.sti_t7 = (int32_t)(ins[8]) << 24 | (int32_t)(ins[9]) << 16 | (int32_t)(ins[10]) << 8 | (int32_t)(ins[11]); //8~11
instru.sti_v6 = 25000; //12~15
instru.sti_v7 = 25000;; //16~19
instru.sti_t1 = VALUE_ZERO_TO_ONE(instru.sti_t1);
instru.sti_t2 = VALUE_ZERO_TO_ONE(instru.sti_t2);
instru.sti_t3 = VALUE_ZERO_TO_ONE(instru.sti_t3);
instru.sti_t4 = VALUE_ZERO_TO_ONE(instru.sti_t4);
instru.sti_t5 = VALUE_ZERO_TO_ONE(instru.sti_t5);
instru.sti_t6 = VALUE_ZERO_TO_ONE(instru.sti_t6);
instru.sti_t7 = VALUE_ZERO_TO_ONE(instru.sti_t7);
megaStiEnable = true;
} else if (ins[3] == PARA_17) {
instru.eliteFxn = CURVE_PULSE;
ModeLED(WORKING);
}
break;
}
case CURVE_UNI_PULSE: {
if (ins[3] == PARA_1) {
uint8_t seg_index = ins[12];
@@ -1058,6 +1016,7 @@ static void update_ZM_instruction(uint8 *ins) {
} else if (ins[3] == PARA_FINAL) {
instru.eliteFxn = CURVE_UNI_PULSE;
instru.hign_z_en = ins[5] & 0x0F;
instru.VoutGainLv = VOUT_GAIN_240K;
@@ -1122,6 +1081,8 @@ static void update_ZM_instruction(uint8 *ins) {
dpv_curr_rec_percent_max[1] = (uint32_t)ins[11];
} else if (ins[3] == PARA_FINAL) {
instru.hign_z_en = ins[5] & 0x0F;
dpv_e_init = UC_TO_5NV(dpv_e_init);
dpv_e_final = UC_TO_5NV(dpv_e_final);
dpv_amp = UC_TO_5NV(dpv_amp);
@@ -1230,6 +1191,8 @@ static void update_ZM_instruction(uint8 *ins) {
dpv_cycle = (uint16_t)ins[9] << 8 | (uint16_t)ins[10];
} else if (ins[3] == PARA_FINAL) {
instru.hign_z_en = ins[5] & 0x0F;
dpv_e_init = UC_TO_5NV(dpv_e_init);
dpv_e_final = UC_TO_5NV(dpv_e_final);
dpv_amp = UC_TO_5NV(dpv_amp);
@@ -1385,17 +1348,17 @@ static void update_ZM_instruction(uint8 *ins) {
case BAT_DEV_TEST: {
headstage_battery_volt();
uint32_t bat = (uint32_t)NotifyVoltBat;
// uint32_t bat = (uint32_t)NotifyVoltBat;
initCISBuf();
cis_buf[0] = 6; //data len
cis_buf[1] = BAT_DEV_TEST;
cis_buf[2] = (uint8_t)(bat >> 24);
cis_buf[3] = (uint8_t)(bat >> 16);
cis_buf[4] = (uint8_t)(bat >> 8);
cis_buf[5] = (uint8_t)(bat);
cis_buf[6] = 0x00;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
// initCISBuf();
// cis_buf[0] = 6; //data len
// cis_buf[1] = BAT_DEV_TEST;
// cis_buf[2] = (uint8_t)(bat >> 24);
// cis_buf[3] = (uint8_t)(bat >> 16);
// cis_buf[4] = (uint8_t)(bat >> 8);
// cis_buf[5] = (uint8_t)(bat);
// cis_buf[6] = 0x00;
// SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
@@ -1412,16 +1375,63 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case LED_DEV_TEST: {
if (ins[4] == 0) {
Elite_led_color(ins[5]);
} else if (ins[4] == 1) {
LED_color(LIGHTLED, ins[5], ins[6], ins[7]);
} else if (ins[4] == 2) {
LED_color(DARKLED, ins[5], ins[6], ins[7]);
case LED_DEV_TEST: { // 0x3000FF 04
uint8_t *p = ins;
struct led_color_t led_c;
uint8_t led_item = p[4];
uint8_t c_num = p[5];
led_c.r = p[5];
led_c.g = p[6];
led_c.b = p[7];
if (led_item == DEV_LED_RAINBOW)
led_rainbow(LED_BR_LV1);
if (led_item == DEV_LED_LIMIT_COLOR)
led_color_set(LED_NB_MAX, LED_BR_LV1, (enum led_color_e)c_num);
if (led_item == DEV_LED_DARK_COLOR)
led_color_code_set(LED_NB_MAX, LED_BR_LV1, &led_c);
if (led_item == DEV_LED_LIGHT_COLOR)
led_color_code_set(LED_NB_MAX, LED_BR_LV8, &led_c);
if (led_item == 4) {
led_color_code_set(LED_NB_MAX, LED_BR_LV1, &led_c);
/* led_color_set(LED_NB_2, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_3, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_5, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_6, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_8, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_9, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_11, LED_BR_LV1, LED_CLR_ORANGE);
led_color_set(LED_NB_12, LED_BR_LV1, LED_CLR_ORANGE); */
}
break;
}
case 0x30: { // update divis on cp mode
uint8_t *p = ins;
cp_devis = p[5] << 8 | p[6];
if (p[4] == 0)
cp_devis_en = FALSE;
else
cp_devis_en = TRUE;
initCISBuf();
uint32_t temperature = (uint32_t)NotifyTemperature;
cis_buf[0] = 6; //data len
cis_buf[1] = 0x30;
cis_buf[2] = 3;
cis_buf[3] = cp_devis_en;
cis_buf[4] = (uint8_t)(cp_devis >> 8);
cis_buf[5] = (uint8_t)(cp_devis);
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
}
break;
}
@@ -1459,12 +1469,12 @@ static void update_ZM_instruction(uint8 *ins) {
PeriodicEvent = true;
InitPeriodicEvent = true; // need to create a WorkModeData?
mode_init = true;
InitGPT();
// InitGPT();
break;
}
case VIS_FUH: {
LED_color(DARKLED, 0x0F, 0x00, 0x0F);
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_MAGENTA);
break;
}
@@ -1477,36 +1487,19 @@ static void update_ZM_instruction(uint8 *ins) {
}
case VIS_DEVICE_SHINY: {
Elite_led_color(COLOR_PURPLE);
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_PURPLE);
break;
}
case VIS_SHINY_DIS: {
if (PeriodicEvent) {
WORKLED();
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_CYAN);
} else if (!PeriodicEvent) {
LEDPowerON();
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_GREEN);
}
break;
}
case VIS_CC_ZERO: {
instru.eliteFxn = CURVE_OCP;
instru.notifyRate = 500;
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
instru.gain_switch_on = 0b11110000;
} else {
// fast notify rate, >= 10sps, auto gain changer only use ADC gain level = 1.2.3
instru.gain_switch_on = 0b01110000;
}
ModeLED(PRE_WORK);
break;
}
default: {
break;
}
@@ -1516,11 +1509,6 @@ static void update_ZM_instruction(uint8 *ins) {
case INS_TYPE_CIS: {
switch (oper) {
case 0x00: {
I2CWrite(0x01, 0xAB);
break;
}
case CIS_VERSION: {
initCISBuf();
cis_buf[0] = 6; //data len
@@ -1576,7 +1564,6 @@ static void update_ZM_instruction(uint8 *ins) {
static void ZM_instruction_update_handle(uint8_t characteristic) {
switch (characteristic) {
case BLE_INS_BUFF_CHAR:
// LED_color(0xf8, 0x00, 0xFF, 0xFF);
SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR3, ins_buf);
update_ZM_instruction(ins_buf);
break;
@@ -1585,116 +1572,85 @@ static void ZM_instruction_update_handle(uint8_t characteristic) {
}
}
#ifndef DEVICE_NAME
#error "DEVICE_NAME not defined"
#endif
#ifndef MAJOR_PRODUCT_NUMBER
#error "MAJOR_PRODUCT_NUMBER not defined"
#endif
#ifndef MINOR_PRODUCT_NUMBER
#error "MINOR_PRODUCT_NUMBER not defined"
#endif
#ifndef MAJOR_VERSION_NUMBER
#error "MAJOR_VERSION_NUMBER not defined"
#endif
#ifndef MINOR_VERSION_NUMBER
#error "MINOR_VERSION_NUMBER not defined"
#endif
#include "devinfoservice.h"
#include "gapgattserver.h"
#include "gattservapp.h"
struct date_t {
uint8_t year;
uint8_t month;
uint8_t day;
};
struct device_info_t {
struct date_t date;
};
struct device_info_t device_info;
void get_date(struct date_t *date)
{
const char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
struct date_t *d = date;
char year_s[5] = {0};
char month_s[4] = {0};
char day_s[3] = {0};
int i;
char date_now[] = __DATE__;
memcpy(year_s, date_now + 9, 2);
memcpy(month_s, date_now, 3);
memcpy(day_s, date_now + 4, 2);
d->year = atoi(year_s);
d->day = atoi(day_s);
for (i=0; i<12; i++) {
if (!strcmp(month_s, months[i])) {
d->month = i + 1;
break;
}
}
return;
}
static void headstage_init_device_info() {
char * date = __DATE__;
uint8_t year = 10 * (date[9] - '0') + (date[10] - '0');
uint8_t month = 0;
uint8_t scan_rsp_data[64] = {9};
uint8_t *p = scan_rsp_data;
struct device_info_t *dev = &device_info;
int i;
switch (date[0]) {
case 'J':
// Jan, January
// Jun, June
// Jul, July
if (date[1] == 'a') {
month = 1;
} else if (date[2] == 'n') {
month = 6;
} else {
month = 7;
}
break;
case 'F':
// Feb, February
month = 2;
break;
case 'M':
// Mar, March
// May, May
if (date[2] == 'r') {
month = 3;
} else {
month = 5;
}
break;
case 'A':
// Apr, April
// Ang, August
if (date[1] == 'p') {
month = 4;
} else {
month = 8;
}
break;
case 'S':
// Sep, September
month = 9;
break;
case 'O':
// Oct, October
month = 10;
break;
case 'N':
// Nov, November
month = 11;
break;
case 'D':
// Dec, December
month = 12;
break;
}
get_date(&device_info.date);
uint8_t scanRspData[64];
uint8_t *p = scanRspData;
*p++ = sizeof(DEVICE_NAME);
*p++ = GAP_ADTYPE_LOCAL_NAME_COMPLETE;
for (unsigned int i = 0; i < sizeof(DEVICE_NAME) - 1; i++) {
*p++ = sizeof(DEVICE_NAME); // 10
*p++ = GAP_ADTYPE_LOCAL_NAME_COMPLETE; // 09
for (i=0; i<sizeof(DEVICE_NAME)-1; i++) {
*p++ = DEVICE_NAME[i];
}
*p++ = 16;
*p++ = GAP_ADTYPE_MANUFACTURER_SPECIFIC;
*p++ = 'B';
*p++ = 'P';
*p++ = 'H';
*p++ = 'S';
*p++ = MAJOR_PRODUCT_NUMBER;
*p++ = MINOR_PRODUCT_NUMBER;
*p++ = MAJOR_VERSION_NUMBER;
*p++ = MINOR_VERSION_NUMBER;
*p++ = year;
*p++ = month;
*p++ = 'B';
*p++ = 'A';
*p++ = 'T';
*p++ = (uint8_t)(NotifyVoltBat);
*p++ = (uint8_t)(NotifyVoltBat >> 8);
} // 69 108 105 116 101 45 69 73 83
*p++ = 16; // 16
*p++ = GAP_ADTYPE_MANUFACTURER_SPECIFIC; // 255
*p++ = 'B'; // 66
*p++ = 'P'; // 80
*p++ = 'H'; // 72
*p++ = 'S'; // 83
*p++ = MAJOR_PRODUCT_NUMBER; // 0
*p++ = MINOR_PRODUCT_NUMBER; // 4
*p++ = MAJOR_VERSION_NUMBER; // 1
*p++ = MINOR_VERSION_NUMBER; // 0
*p++ = dev->date.year; // 22
*p++ = dev->date.month; // 07
*p++ = 'B'; // 66
*p++ = 'A'; // 65
*p++ = 'T'; // 84
*p++ = (uint8_t)(NotifyVoltBat); // 44
*p++ = (uint8_t)(NotifyVoltBat >> 8); // 33
GGS_SetParameter(GGS_DEVICE_NAME_ATT, sizeof(DEVICE_NAME), DEVICE_NAME);
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, p - scanRspData, scanRspData);
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, p - scan_rsp_data, scan_rsp_data);
}
#endif // HEADSTAGE_H
@@ -1,311 +0,0 @@
#ifndef HEADSTAGE_H
#error "headstage.h not include"
#endif
#ifdef HEADSTAGE_H_H
#error "headstage_*.h has be included"
#endif
#ifndef HEADSTAGE_TNI_H
#define HEADSTAGE_H_H
#define HEADSTAGE_TNI_H
// product information
#define DEVICE_NAME "Elite-v0.1"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 1
#define MAJOR_VERSION_NUMBER 0
#define MINOR_VERSION_NUMBER 1
// header
#include <ti/drivers/PIN.h>
#include "board.h"
/*============
==== SPI ====
===========*/
/* application use SPI parameters and buffers */
#define SPI_BUFFER_SIZE 16
/**
* the pointer to point which channel is used currently.
* -1 for not beginning.
*/
static int8 channel_pointer = -1;
static uint8_t spi_txbuf[SPI_BUFFER_SIZE] = {0};
static uint8_t spi_rxbuf[SPI_BUFFER_SIZE] = {0};
/*=============================
==== headstage variable ====
============================*/
PIN_Handle pin_handle;
static PIN_State DBS_rst;
// DBS reset pin
const PIN_Config BLE_IO[] = {
//
IOID_9 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
IOID_2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
IOID_3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
IOID_13 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
PIN_TERMINATE //
};
/**
* ADC clock switch signal.
*/
static bool adc_clock_signal = FALSE;
/*=======================================
==== headstage function declaration ====
======================================*/
static void headstage_tni_update_instruction_callback(uint8_t ins_type, uint8_t ins_op, uint8_t ins_len, uint8_t *ins);
/*=============================
==== ramp data generating ====
============================*/
static uint16_t ramp_data_counter = 0;
static void create_ramp(uint8_t *buff) {
buff[0] = 0b10110000 | (0b00001111 & (uint8_t)(ramp_data_counter >> 6));
buff[1] = (uint8_t)(ramp_data_counter << 2);
ramp_data_counter += 1;
}
/*=======================================
==== headstage function implemented ====
======================================*/
/**
* change channel value to little endian
*/
static uint8 encode_channel(uint8 channel) {
return 0x0F & (((channel & 0b1000) >> 3) | //
((channel & 0b0100) >> 1) | //
((channel & 0b0010) << 1) | //
((channel & 0b0001) << 3));
}
static void headstage_init() {
set_update_instruction_callback(headstage_tni_update_instruction_callback);
// initialize the DBS reset pin
pin_handle = PIN_open(&DBS_rst, BLE_IO);
PIN_setOutputValue(pin_handle, IOID_9, 1);
PIN_setOutputValue(pin_handle, IOID_2, 0);
PIN_setOutputValue(pin_handle, IOID_3, 0);
}
/**
* change the recording clock bit in the instruction buffer.
*/
static void update_ins_rec_clock(uint8_t *buf, bool adc_clock_signal) {
buf[3] = (buf[3] & 0b11110000) | ((adc_clock_signal) ? 0b1000 : 0);
}
/**
* change the recording channel bit in the instruction buffer.
*/
static void update_ins_rec_channel(uint8_t *buf, uint8 channel) {
buf[1] = (buf[1] & 0b00001111) | (encode_channel(channel) << 4);
}
/**
* change the stimulation enable bit in the instruction buffer.
*/
static void update_ins_sti_enable(uint8_t *buf, bool enable) {
buf[1] = (buf[1] & 0b11111101) | ((enable) ? 0b10 : 0);
}
/**
* change the stimulating channel bit in the instruction buffer.
*/
static void update_ins_sti_channel(uint8_t *buf, uint8 sti_chp, uint8 sti_chn) {
buf[2] = (buf[2] & 0b11110000) | encode_channel(sti_chp);
buf[3] = (buf[3] & 0b00001111) | (encode_channel(sti_chn) << 4);
}
static void update_ins_buffer() {
uint8 header = 0b10100000;
uint8 amp_gain = (instru.amp_gain & 0b11) << 3;
uint8 amp_lbf = instru.amp_low_band_freq & 0b111;
uint8 channel = 0; // should be call update_ins_channel to modify this value
uint8 chopper = (instru.chopper) ? 0b00001000 : 0;
uint8 fast_settle = (instru.fast_settle) ? 0b00000100 : 0;
uint8 sti_enable = (instru.work_mode != STI_MODE_DISABLE) ? 0b00000010 : 0;
uint8 sti_volt_l = (instru.sti_volt & 0b11111) >> 4;
uint8 sti_volt_h = (instru.sti_volt & 0b01111) << 4;
uint8 sti_chp = instru.sti_channel_pmos & 0b1111;
uint8 sti_chn = (instru.sti_channel_nmos & 0b1111) << 4;
uint8 clk_signal = 0; // should be call update_ins_clock to modify this value
spi_txbuf[0] = header | amp_gain | amp_lbf;
spi_txbuf[1] = channel | chopper | fast_settle | sti_enable | sti_volt_l;
spi_txbuf[2] = sti_volt_h | sti_chp;
spi_txbuf[3] = sti_chn | clk_signal;
}
static bool update_ins_rec_buffer() {
adc_clock_signal = (adc_clock_signal) ? FALSE : TRUE; // switch adc_clock
update_ins_rec_clock(spi_txbuf, adc_clock_signal);
if (adc_clock_signal) {
// change to next channel
if (next_active_channel()) {
update_ins_rec_channel(spi_txbuf, channel_pointer);
} else {
// no channel active
return false;
}
}
return true;
}
/**
* Change the instruction content for SPI buffer, which is depended on the
* work_mode. Expend the remind instruction according to the base instruction
* which allocated at the beginning 4 bytes of the SPI buffer.
*
* ========= ===========
* work_mode ins pattern
* ========= ===========
* POS, NEG 4 F D 0
* P2N, N2P 4 4' F D
* AWF not impl
* ========= ===========
*
* pattern *4*
* stimulation instruction.
*
* pattern *F*
* set pmos channel to 0xF, release the remain voltage in the capacitance.
*
* pattern *D*
* disable stimulation
*
* pattern *0*
* nop.
*
* @param: buf: pointer of the SPI buffer.
*/
static void update_ins_sti_buffer() {
switch (instru.work_mode) {
case STI_MODE_POS:
case STI_MODE_NEG:
// copy [4:7]
spi_txbuf[4] = spi_txbuf[0];
spi_txbuf[5] = spi_txbuf[1];
spi_txbuf[6] = spi_txbuf[2];
spi_txbuf[7] = spi_txbuf[3];
// copy [8:B]
spi_txbuf[8] = spi_txbuf[0];
spi_txbuf[9] = spi_txbuf[1];
spi_txbuf[10] = spi_txbuf[2];
spi_txbuf[11] = spi_txbuf[3];
// reset [C:F]
spi_txbuf[12] = 0;
spi_txbuf[13] = 0;
spi_txbuf[14] = 0;
spi_txbuf[15] = 0;
// change content
update_ins_sti_enable(spi_txbuf, TRUE);
// ins buf [4:7]
update_ins_sti_enable(spi_txbuf + 4, TRUE);
update_ins_sti_channel(spi_txbuf + 4, 0xF, instru.sti_channel_pmos);
// ins buf [8:B]
update_ins_sti_enable(spi_txbuf + 8, FALSE);
break;
case STI_MODE_P2N:
case STI_MODE_N2P:
// copy [4:7]
spi_txbuf[4] = spi_txbuf[0];
spi_txbuf[5] = spi_txbuf[1];
spi_txbuf[6] = spi_txbuf[2];
spi_txbuf[7] = spi_txbuf[3];
// copy [8:B]
spi_txbuf[8] = spi_txbuf[0];
spi_txbuf[9] = spi_txbuf[1];
spi_txbuf[10] = spi_txbuf[2];
spi_txbuf[11] = spi_txbuf[3];
// copy [C:F]
spi_txbuf[12] = spi_txbuf[0];
spi_txbuf[13] = spi_txbuf[1];
spi_txbuf[14] = spi_txbuf[2];
spi_txbuf[15] = spi_txbuf[3];
// change content
update_ins_sti_enable(spi_txbuf + 0, TRUE);
update_ins_sti_channel(spi_txbuf + 0, instru.sti_channel_pmos, instru.sti_channel_nmos);
// ins buf [4:7]
update_ins_sti_enable(spi_txbuf + 4, TRUE);
update_ins_sti_channel(spi_txbuf + 4, instru.sti_channel_nmos, instru.sti_channel_pmos);
// ins buf [8:B]
update_ins_sti_enable(spi_txbuf + 8, TRUE);
update_ins_sti_channel(spi_txbuf + 8, 0xF, instru.sti_channel_nmos);
// ins buf [C:F]
update_ins_sti_enable(spi_txbuf + 12, FALSE);
break;
case STI_MODE_AWF:
// XXX define the voltage change
break;
default:
// do nothing
break;
}
}
static void headstage_tni_update_instruction_callback(uint8_t ins_type, uint8_t ins_op, uint8_t ins_len, uint8_t *ins) {
switch (ins_type) {
case INS_TYPE_VIS: {
// reset
case VIS_RST:
// reset. reset all variable
adc_clock_signal = FALSE;
memset(spi_txbuf, 0, SPI_BUFFER_SIZE);
break;
// interrupt
case VIS_INT:
// stop. reset channel table
ramp_data_counter = 0;
memset(spi_txbuf, 0, SPI_BUFFER_SIZE);
break;
}
case INS_TYPE_RIS:
default:
break;
}
}
static uint8_t *spi_transact_rec_instruction() {
if (IS_REC_MODE(instru.work_mode)) {
PIN_setOutputValue(pin_handle, IOID_13, 1); // DBS_P2S turn on
headstage_spi_transaction(SPI_BUFFER_SIZE, spi_txbuf, spi_rxbuf);
PIN_setOutputValue(pin_handle, IOID_13, 0); // DBS_P2S turn off
} else if (IS_ARM_MODE(instru.work_mode) && !adc_clock_signal) {
create_ramp(spi_rxbuf);
}
if (adc_clock_signal) {
return NULL;
} else {
return spi_rxbuf;
}
}
static uint8_t *spi_transact_sti_instruction() {
headstage_spi_transaction(16, spi_txbuf, NULL);
return NULL;
}
#endif
@@ -17,62 +17,33 @@
#define IMPEDANCE_METER_H_
// header
#include <ti/drivers/PIN.h>
#include "board.h"
#include "EliteWorkData.h"
#include <driverlib/aon_batmon.h>
static void SimpleBLEPeripheral_performPeriodicTask(void);
static void SimpleBLEPeripheral_clockHandler(UArg arg) {
// Store the event.
// events |= SBP_PERIODIC_EVT;
// Wake up the application.
// Semaphore_post(semaphore); // send samaphore to jump out of infinite waiting(simple_peripheral.c line570)
}
static void elite_gptimer_callback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask) {
events |= SBP_PERIODIC_EVT;
Semaphore_post(semaphore);
GPT.GptimerCounter++;
}
static void ZM_update_instruction_callback(uint8_t ins_type, uint8_t chip_ID, uint8_t *ins);
static void ZM_init() {
set_update_instruction_callback(ZM_update_instruction_callback);
// initialize
pin_handle = PIN_open(&ZM_rst, BLE_IO);
Init_Elite15_PIN();
ELITE15_SPI_HOLD();
PIN15_setOutputValue(shutdown_6994, 1); // OFF = 1 => turn off 6994
PIN15_setOutputValue(enable_10v, 0); // enable 10V
PIN15_setOutputValue(HIGH_Z_MODE, 0); // HIGH Z MODE // 1: close; 0: open;
static void device_init(void)
{
gpio_create();
InitEliteInstruction();
// init DAC, set output ~= 0 V
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
update_latch_stat(E_LATCH_CS_MEM, 1);
update_latch_stat(E_LATCH_CS_ADC, 1);
update_latch_stat(E_LATCH_CS_DAC, 1);
update_latch_stat(E_LATCH_OFF, 1); // E_LATCH_OFF = 1 => turn off 6994
latch_multi_ctrl();
/* when elite open, must change vin level,
measure battery value will be right */
VinADCGainCtrl(VIN_GAIN_AUTO);
measure battery value will be right */
IinADCGainCtrl(instru.IinADCGainLv);
VinADCGainCtrl(instru.VinADCGainLv);
VoutGainControl(instru.VoutGainLv);
DAC0_W_T(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
elite_gptimer_open();
elite_gptimer_start();
// PIN_registerIntCb(pin_handle, switch_on_callback);
// PIN_setInterrupt(pin_handle, switch_on | PIN_IRQ_POSEDGE);
InitGPT();
return;
}
static void ZM_update_instruction_callback(uint8_t ins_type, uint8_t chip_ID, uint8_t *ins) {}
#define IsPeriodicMode() ( \
(instru.eliteFxn == CURVE_IV) || \
(instru.eliteFxn == CURVE_IV_CY) || \
@@ -80,12 +51,13 @@ static void ZM_update_instruction_callback(uint8_t ins_type, uint8_t chip_ID, ui
(instru.eliteFxn == CURVE_VT) || \
(instru.eliteFxn == CURVE_RT) || \
(instru.eliteFxn == CURVE_CC) || \
(instru.eliteFxn == CURVE_CP) || \
(instru.eliteFxn == CURVE_CV) || \
(instru.eliteFxn == CURVE_LSV) || \
(instru.eliteFxn == CURVE_CA) || \
(instru.eliteFxn == CURVE_VO) || \
(instru.eliteFxn == CURVE_OCP) || \
(instru.eliteFxn == CURVE_CALI_ADC) \
(instru.eliteFxn == CURVE_CALI) \
)
#define Ve1MatchVe2Mode() ( \
@@ -95,166 +67,54 @@ static void ZM_update_instruction_callback(uint8_t ins_type, uint8_t chip_ID, ui
(instru.eliteFxn == CURVE_LSV) \
)
static void pulse_mode(void)
{
// Default working flow is vscan -> ADC read -> send notify
// We will need a flag to control vscan, ADC and notify
if(mode_init){
GPT.SampleRateCounter = instru.sampleRate - 10;
GPT.VscanRateCounter = instru.VsetRate - 1;
mode_init = false;
batteryADC_flag = false;
volt_rec_en = true;
curr_rec_en = true;
firstTimeReset = true;
notifyFirst_flag = true;
//pulsemode variable
stiFirstTime = true;
VinADCGainCtrl(instru.VinADCGainLv);
IinADCGainCtrl(instru.IinADCGainLv);
VoutGainControl(instru.VoutGainLv);
if (Ve1MatchVe2Mode()) {
if (instru.Ve1 == instru.Ve2) {
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, instru.Ve1));
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
} else if (instru.eliteFxn == CURVE_PULSE) {
if(!megaStiEnable){
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
}
GPT.LeadTimeCounter = GPT.LeadTimeCounter + GPT.DeltaGptimerCounter;
if(leadTimeReset && GPT.LeadTimeCounter <= 2000){
vscanReset = true;
}else{
if(notifyFirst_flag){
GPT.NotifyCounter = instru.notifyRate - 20;
notifyFirst_flag = false;
}
vscanReset = false;
leadTimeReset = false;
}
//vscan counter
GPT.VscanRateCounter = GPT.VscanRateCounter + GPT.DeltaGptimerCounter;
//pulse mode counter
GPT.StiCounter = GPT.StiCounter + GPT.DeltaGptimerCounter;
if (vscanReset) {
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
//vscanReset = false;
}else{
if (megaStiEnable) {
pulse_vscan();
}
}
//battery counter
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
if(GPT.BatteryCheckCounter >= 50000){
GPT.BatteryCheckCounter -= 50000; //To get right time
batteryCheck_flag = true;
tempCheck_flag = true;
if ((instru.eliteFxn == CURVE_IV) ||
(instru.eliteFxn == CURVE_IV_CY) ||
(instru.eliteFxn == CURVE_CC) ||
(instru.eliteFxn == CURVE_CV) ||
(instru.eliteFxn == CURVE_LSV) ||
(instru.eliteFxn == CURVE_CA) ||
(instru.eliteFxn == CURVE_OCP) ||
(instru.eliteFxn == CURVE_PULSE) ||
(instru.eliteFxn == CURVE_UNI_PULSE) ||
(instru.eliteFxn == CURVE_DPV) ||
(instru.eliteFxn == CURVE_DPV_SMPRATE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE_SMPRATE) ||
(instru.eliteFxn == CURVE_CALI_ADC)) {
batteryCheck_flag = false;
tempCheck_flag = false;
}
}
uint16_t bat = NotifyVoltBat;
if( bat < 768 && bat > 20){
PIN15_setOutputValue(enable_5v, 0);
}
//ADC counter
GPT.SampleRateCounter = GPT.SampleRateCounter + GPT.DeltaGptimerCounter;
if(GPT.SampleRateCounter >= instru.sampleRate){
GPT.SampleRateCounter = 0; //To get right data, ADC must be delay 1.5ms
EliteADCControl(0);
}
//Notify counter(Notify control, check if we need to send notify)
//please don't put Notify counter before ADC counter, maybe get wrong data
GPT.NotifyCounter = GPT.NotifyCounter + GPT.DeltaGptimerCounter;
if(GPT.NotifyCounter >= instru.notifyRate){
GPT.NotifyCounter -= instru.notifyRate; //To get right time
notify_flag = true;
if(vscanReset){
notify_flag = false;
}
if(notify_flag){
SendNotify();
notify_flag = false;
}
}
mode_done();
}
static void peri_mode(void)
{
GPT.LeadTimeCounter = GPT.LeadTimeCounter + GPT.DeltaGptimerCounter;
if (leadTimeReset && GPT.LeadTimeCounter <= 2000) {
GPT.cnt_lead_time = GPT.cnt_lead_time + GPT.cnt_gpt_delta;
if (leadTimeReset && GPT.cnt_lead_time <= 2000) {
vscanReset = true;
if (first_highz_flag && GPT.LeadTimeCounter >= 1000) {
if (instru.eliteFxn == CURVE_OCP) {
PIN15_setOutputValue(HIGH_Z_MODE, 0);
if (first_highz_flag && GPT.cnt_lead_time >= 1000) {
if (instru.eliteFxn == CURVE_OCP || instru.eliteFxn == CURVE_CC || instru.eliteFxn == CURVE_CP) {
HIGH_Z_OPEN(); // HIGH Z MODE // 1: close; 0: open;
} else {
PIN15_setOutputValue(HIGH_Z_MODE, 1); // HIGH Z MODE // 1: close; 0: open;
//latch_single_ctrl(E_LATCH_HIGH_Z, instru.hign_z_en); // HIGH Z MODE // 1: close; 0: open;
if(instru.hign_z_en == 1) {
HIGH_Z_CLOSE();
}
else{
HIGH_Z_OPEN();
}
}
first_highz_flag = false;
}
} else {
if (notifyFirst_flag) {
GPT.NotifyCounter = instru.notifyRate - 20;
GPT.cnt_notify_rate = instru.notifyRate - 20;
notifyFirst_flag = false;
if (instru.eliteFxn == CURVE_CC || instru.eliteFxn == CURVE_CP) {
latch_single_ctrl(E_LATCH_HIGH_Z, instru.hign_z_en); // HIGH Z MODE // 1: close; 0: open;
}
}
vscanReset = false;
leadTimeReset = false;
}
//vscan counter
GPT.VscanRateCounter = GPT.VscanRateCounter + GPT.DeltaGptimerCounter;
if (GPT.VscanRateCounter >= instru.VsetRate) {
if (GPT.VscanRateCounter >= instru.VsetRate * 2) {
GPT.GptimerMultiple = GPT.VscanRateCounter / instru.VsetRate;
GPT.cnt_v_scan_rate = GPT.cnt_v_scan_rate + GPT.cnt_gpt_delta;
if (GPT.cnt_v_scan_rate >= instru.VsetRate) {
if (GPT.cnt_v_scan_rate >= instru.VsetRate * 2) {
GPT.GptimerMultiple = GPT.cnt_v_scan_rate / instru.VsetRate;
} else {
GPT.GptimerMultiple = 1;
}
GPT.VscanRateCounter -= instru.VsetRate * GPT.GptimerMultiple; //To get right time
GPT.cnt_v_scan_rate -= instru.VsetRate * GPT.GptimerMultiple; //To get right time
vscan_ctrl(0);
}
//battery counter
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.cnt_gpt_delta;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.cnt_gpt_delta;
if(GPT.BatteryCheckCounter >= 50000){
GPT.BatteryCheckCounter -= 50000; //To get right time
batteryCheck_flag = true;
@@ -262,17 +122,17 @@ static void peri_mode(void)
if ((instru.eliteFxn == CURVE_IV) ||
(instru.eliteFxn == CURVE_IV_CY) ||
(instru.eliteFxn == CURVE_CC) ||
(instru.eliteFxn == CURVE_CP) ||
(instru.eliteFxn == CURVE_CV) ||
(instru.eliteFxn == CURVE_LSV) ||
(instru.eliteFxn == CURVE_CA) ||
(instru.eliteFxn == CURVE_OCP) ||
(instru.eliteFxn == CURVE_PULSE) ||
(instru.eliteFxn == CURVE_UNI_PULSE) ||
(instru.eliteFxn == CURVE_DPV) ||
(instru.eliteFxn == CURVE_DPV_SMPRATE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE_SMPRATE) ||
(instru.eliteFxn == CURVE_CALI_ADC)) {
(instru.eliteFxn == CURVE_CALI)) {
batteryCheck_flag = false;
tempCheck_flag = false;
@@ -281,27 +141,27 @@ static void peri_mode(void)
uint16_t bat = NotifyVoltBat;
if( bat < 768 && bat > 20){
// PIN15_setOutputValue(enable_5v, 0);
// latch_single_ctrl(E_LATCH_5V_ENABLE, 0);
}
//ADC counter
GPT.SampleRateCounter = GPT.SampleRateCounter + GPT.DeltaGptimerCounter;
if(GPT.SampleRateCounter >= instru.sampleRate){
GPT.SampleRateCounter = 0; //To get right data, ADC must be delay 1.5ms
GPT.cnt_adc_rate = GPT.cnt_adc_rate + GPT.cnt_gpt_delta;
if(GPT.cnt_adc_rate >= instru.sampleRate){
GPT.cnt_adc_rate = 0; //To get right data, ADC must be delay 1.5ms
EliteADCControl(0);
}
// Over temperature protection
uint16_t CC2650temp = NotifyTemperature;
if(CC2650temp > 40) {
PIN15_setOutputValue(enable_5v, 0);
latch_single_ctrl(E_LATCH_5V_ENABLE, 0);
}
//Notify counter(Notify control, check if we need to send notify)
//please don't put Notify counter before ADC counter, maybe get wrong data
GPT.NotifyCounter = GPT.NotifyCounter + GPT.DeltaGptimerCounter;
if(GPT.NotifyCounter >= instru.notifyRate){
GPT.NotifyCounter -= instru.notifyRate; //To get right time
GPT.cnt_notify_rate = GPT.cnt_notify_rate + GPT.cnt_gpt_delta;
if(GPT.cnt_notify_rate >= instru.notifyRate){
GPT.cnt_notify_rate -= instru.notifyRate; //To get right time
notify_flag = true;
if(vscanReset){
notify_flag = false;
@@ -326,22 +186,22 @@ static void uni_pulse_mode(void)
// Default working flow is vscan -> ADC read -> send notify
// We will need a flag to control vscan, ADC and notify
GPT.LeadTimeCounter = GPT.LeadTimeCounter + GPT.DeltaGptimerCounter;
if (leadTimeReset && GPT.LeadTimeCounter <= 2000) {
GPT.cnt_lead_time = GPT.cnt_lead_time + GPT.cnt_gpt_delta;
if (leadTimeReset && GPT.cnt_lead_time <= 2000) {
vscanReset = true;
GPT.VscanRateCounter = 0xFFFFFFFF;
GPT.cnt_v_scan_rate = 0xFFFFFFFF;
dpv_step_cnt = 0;
if (first_highz_flag && GPT.LeadTimeCounter >= 1000) {
PIN15_setOutputValue(HIGH_Z_MODE, instru.hign_z_en); // HIGH Z MODE // 1: close; 0: open;
if (first_highz_flag && GPT.cnt_lead_time >= 1000) {
latch_single_ctrl(E_LATCH_HIGH_Z, instru.hign_z_en); // HIGH Z MODE // 1: close; 0: open;
first_highz_flag = false;
}
} else {
if (notifyFirst_flag) {
GPT.NotifyCounter = instru.notifyRate - 20;
GPT.cnt_notify_rate = instru.notifyRate - 20;
notifyFirst_flag = false;
}
if (vscanReset) {
GPT.VscanRateCounter = 0xFFFFFFFF;
GPT.cnt_v_scan_rate = 0xFFFFFFFF;
dpv_step_cnt = 0;
}
vscanReset = false;
@@ -349,16 +209,16 @@ static void uni_pulse_mode(void)
}
//vscan counter
GPT.VscanRateCounter = GPT.VscanRateCounter + GPT.DeltaGptimerCounter;
if (GPT.VscanRateCounter >= instru.period) {
GPT.VscanRateCounter -= instru.period; //To get right time
GPT.cnt_v_scan_rate = GPT.cnt_v_scan_rate + GPT.cnt_gpt_delta;
if (GPT.cnt_v_scan_rate >= instru.period) {
GPT.cnt_v_scan_rate -= instru.period; //To get right time
dpv_step_cnt +=1;
}
vscan_ctrl(GPT.VscanRateCounter);
vscan_ctrl(GPT.cnt_v_scan_rate);
//battery counter
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.cnt_gpt_delta;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.cnt_gpt_delta;
if(GPT.BatteryCheckCounter >= 50000){
GPT.BatteryCheckCounter -= 50000; //To get right time
batteryCheck_flag = true;
@@ -371,13 +231,12 @@ static void uni_pulse_mode(void)
(instru.eliteFxn == CURVE_LSV) ||
(instru.eliteFxn == CURVE_CA) ||
(instru.eliteFxn == CURVE_OCP) ||
(instru.eliteFxn == CURVE_PULSE) ||
(instru.eliteFxn == CURVE_UNI_PULSE) ||
(instru.eliteFxn == CURVE_DPV) ||
(instru.eliteFxn == CURVE_DPV_SMPRATE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE_SMPRATE) ||
(instru.eliteFxn == CURVE_CALI_ADC)) {
(instru.eliteFxn == CURVE_CALI)) {
batteryCheck_flag = false;
tempCheck_flag = false;
@@ -385,21 +244,21 @@ static void uni_pulse_mode(void)
}
//ADC counter
GPT.SampleRateCounter = GPT.SampleRateCounter + GPT.DeltaGptimerCounter;
if(GPT.SampleRateCounter >= instru.sampleRate){
GPT.SampleRateCounter = 0; //To get right data, ADC must be delay 1.5ms
EliteADCControl(GPT.VscanRateCounter);
GPT.cnt_adc_rate = GPT.cnt_adc_rate + GPT.cnt_gpt_delta;
if(GPT.cnt_adc_rate >= instru.sampleRate){
GPT.cnt_adc_rate = 0; //To get right data, ADC must be delay 1.5ms
EliteADCControl(GPT.cnt_v_scan_rate);
}
uint16_t bat = NotifyVoltBat;
if( bat < 768 && bat > 20){
// PIN15_setOutputValue(enable_5v, 0);
// latch_single_ctrl(E_LATCH_5V_ENABLE, 0);
}
// Over temperature protection
uint16_t CC2650temp = NotifyTemperature;
if(CC2650temp > 40) {
PIN15_setOutputValue(enable_5v, 0);
latch_single_ctrl(E_LATCH_5V_ENABLE, 0);
}
if (instru.eliteFxn == CURVE_DPV || instru.eliteFxn == CURVE_DPV_ADVANCE) {
@@ -407,9 +266,9 @@ static void uni_pulse_mode(void)
} else {
//Notify counter(Notify control, check if we need to send notify)
//please don't put Notify counter before ADC counter, maybe get wrong data
GPT.NotifyCounter = GPT.NotifyCounter + GPT.DeltaGptimerCounter;
if(GPT.NotifyCounter >= instru.notifyRate){
GPT.NotifyCounter -= instru.notifyRate; //To get right time
GPT.cnt_notify_rate = GPT.cnt_notify_rate + GPT.cnt_gpt_delta;
if(GPT.cnt_notify_rate >= instru.notifyRate){
GPT.cnt_notify_rate -= instru.notifyRate; //To get right time
notify_flag = true;
if (instru.eliteFxn == CURVE_UNI_PULSE) {
notify_flag = false;
@@ -460,23 +319,15 @@ static void mode_init_set(void)
instru.gain_switch_on = 0b01110000;
}
if (instru.IinADCGainLv == I_GAIN_AUTO) {
instru.IinADCGainLv = I_GAIN_100R;
}
if (instru.VinADCAutoGainEn == VIN_GAIN_AUTO) {
instru.VinADCGainLv = VIN_GAIN_1K;
}
VinADCGainCtrl(instru.VinADCGainLv);
IinADCGainCtrl(instru.IinADCGainLv);
VoutGainControl(instru.VoutGainLv);
if (Ve1MatchVe2Mode()) {
if (instru.Ve1 == instru.Ve2) {
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, instru.Ve1));
DAC0_W_T(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
latch_single_ctrl(E_LATCH_HIGH_Z, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
@@ -493,17 +344,17 @@ static void mode_init_set(void)
*
* @return None.
*/
static void SimpleBLEPeripheral_performPeriodicTask(void)
static void elite_task(void)
{
GPT.DeltaGptimerCounter = GPT.GptimerCounter - GPT.GptimerCounter0;
GPT.GptimerCounter0 = GPT.GptimerCounter;
// GPT_timerIncrement();
if (IsPeriodicMode()) {
if (mode_init) {
GPT.SampleRateCounter = instru.sampleRate - 10;
GPT.VscanRateCounter = instru.VsetRate - 1;
mode_init = false;
mode_init_set();
InitGPT();
GPT.cnt_adc_rate = instru.sampleRate - 10;
GPT.cnt_v_scan_rate = instru.VsetRate - 1;
}
peri_mode();
@@ -515,6 +366,7 @@ static void SimpleBLEPeripheral_performPeriodicTask(void)
if (mode_init) {
mode_init = false;
mode_init_set();
InitGPT();
calc_avg_en = false;
}
@@ -527,6 +379,7 @@ static void SimpleBLEPeripheral_performPeriodicTask(void)
if (mode_init) {
mode_init = false;
mode_init_set();
InitGPT();
calc_avg_en = false;
}
@@ -539,6 +392,7 @@ static void SimpleBLEPeripheral_performPeriodicTask(void)
if (mode_init) {
mode_init = false;
mode_init_set();
InitGPT();
}
uni_pulse_mode();
@@ -550,26 +404,39 @@ static void SimpleBLEPeripheral_performPeriodicTask(void)
return;
}
/* Notify data:
* +--------+----------+---------+---------+---------+-----------+-----------------+
* | id(1B) | time(4B) | ch1(4B) | ch2(4B) | ch3(4B) | cycle(2B) | finish_flag(1B) |
* | bat(4B) | notify#(1B) | ch4(4B) | ch5(4B) | ch6(4B) | __(3B) |
* +---------+-------------+---------+---------+---------+--------+
*/
/*
* EliteADCControl(): use ADC plot, and send what data to controller
* +-----------------+-----------+-----------+-----------+
* | MODE | ch1 | ch2 | ch3 |
* +-----------------+-----------+-----------+-----------+
* | CURVE_IV | Iin | Vout | Vin |
* | CURVE_IV_CY | Iin | Vout | Vin |
* | CURVE_VO | Iin | Vout | Vin |
* | CURVE_RT | Iin | Vout | R |
* | CURVE_VT | Iin | Vin | |
* | CURVE_IT | Iin | Vin | Vout |
* | CURVE_CC | Iin | Vin | Vout |
* | CURVE_CV | Iin | Vout-Vin | Vout |
* | CURVE_LSV | Iin | Vout-Vin | Vout |
* | CURVE_CA | Iin | Vout-Vin | Vout |
* | CURVE_OCP | Iin | Vmon-Vin | Vin |
* | CURVE_UNI_PULSE | pul1_Iin | pul2_Iin | |
* +-----------------+-----------+-----------+-----------+
* +---------------------------+-----------+-----------+-----------+-----------+-----------+
* | MODE | ch1 | ch2 | ch3 | cycle | ch4 |
* +---------------------------+-----------+-----------+-----------+-----------+-----------+
* | CURVE_IV | Iin | Vout | Vin | | Vmon |
* | CURVE_IV_CY | Iin | Vout | Vin | v | Vmon |
* | CURVE_VO | Iin | Vout | Vin | | Vmon |
* | CURVE_RT | Iin | Vout | R | | Vmon |
* | CURVE_VT | Iin | Vin | | | |
* | CURVE_IT | Iin | Vin | Vout | | Vmon |
* | CURVE_CC | Iin | Vin | Vout | | Vmon |
* | CURVE_CP | Iin | Vout-Vin | Vout | | Vmon |
* | CURVE_CV | Iin | Vout-Vin | Vout | v | Vmon |
* | CURVE_LSV | Iin | Vout-Vin | Vout | | Vmon |
* | CURVE_CA | Iin | Vout-Vin | Vout | | Vmon |
* | CURVE_OCP | Iin | Vmon-Vin | Vin | | Vmon |
* | CURVE_UNI_PULSE | pul1_Iin | pul2_Iin | | | |
* | CURVE_DPV | c1&c2_avg | Vout-Vin | Vout | | Vmon |
* | CURVE_DPV_SMPRATE | Iin | Vout-Vin | Vout | | Vmon |
* | CURVE_DPV_ADVANCE | c1&c2_avg | Vout-Vin | Vout | | Vmon |
* | CURVE_DPV_ADVANCE_SMPRATE | Iin | Vout-Vin | Vout | | Vmon |
* +---------------------------+-----------+-----------+-----------+-----------+-----------+
*
* ps. c1_avg = pul1_Iin
* ps. c2_avg = pul2_Iin
*/
static void EliteADCControl(uint32_t time)
@@ -582,35 +449,51 @@ static void EliteADCControl(uint32_t time)
case CURVE_IV_CY:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, instru.Vout/200);
InputNotify(NOTIFY_IMPEDANCE, MEAS_VIN(wm));
InputNotify(NOTIFY_CH2, instru.Vout/200);
InputNotify(NOTIFY_CH3, MEAS_VIN(wm));
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_RT:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, instru.Vout/200);
InputNotify(NOTIFY_CH2, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_CC:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
InputNotify(NOTIFY_CH2, MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_CP:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_CH2, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
@@ -619,73 +502,66 @@ static void EliteADCControl(uint32_t time)
case CURVE_LSV:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
}
break;
case CURVE_PULSE:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, MEAS_VOUT(wm));
InputNotify(NOTIFY_CH2, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_IT:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if(volt_rec_en) {
InputNotify(NOTIFY_VOLT, MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
InputNotify(NOTIFY_CH2, MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_VT:
Iin_Vin_Plot();
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, MEAS_VIN(wm));
InputNotify(NOTIFY_CH2, MEAS_VIN(wm));
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_VO:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, instru.Vout/200);
InputNotify(NOTIFY_IMPEDANCE, MEAS_VIN(wm));
InputNotify(NOTIFY_CH2, instru.Vout/200);
InputNotify(NOTIFY_CH3, MEAS_VIN(wm));
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_OCP:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, MEAS_VOUT(wm) - MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, MEAS_VIN(wm));
InputNotify(NOTIFY_CH2, MEAS_VOUT(wm) - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, MEAS_VIN(wm));
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_CALI_ADC:
case CURVE_CALI:
if (instru.AdcChannel == RIS_ADC_IIN) {
cali_IT_plot();
} else if (instru.AdcChannel == RIS_ADC_VIN) {
@@ -701,31 +577,35 @@ static void EliteADCControl(uint32_t time)
case CURVE_DPV:
Iin_Vin_Vout_Plot(t);
notify_ch4 = MEAS_VOUT(wm);
break;
case CURVE_DPV_SMPRATE:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
InputNotify(NOTIFY_CH2, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
case CURVE_DPV_ADVANCE:
Iin_Vin_Vout_Plot(t);
notify_ch4 = MEAS_VOUT(wm);
break;
case CURVE_DPV_ADVANCE_SMPRATE:
Iin_Vin_Vout_Plot(t);
if (curr_rec_en) {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_CH1, MEAS_CURR(wm));
}
if (volt_rec_en) {
InputNotify(NOTIFY_VOLT, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_IMPEDANCE, instru.Vout/200);
InputNotify(NOTIFY_CH2, instru.Vout/200 - MEAS_VIN(wm));
InputNotify(NOTIFY_CH3, instru.Vout/200);
notify_ch4 = MEAS_VOUT(wm);
}
break;
@@ -740,10 +620,13 @@ static void mode_done(void)
(instru.eliteFxn == CURVE_CV) ||
(instru.eliteFxn == CURVE_LSV) ||
(instru.eliteFxn == CURVE_IV_CY) ||
(instru.eliteFxn == CURVE_CC) ||
(instru.eliteFxn == CURVE_DPV) ||
(instru.eliteFxn == CURVE_DPV_SMPRATE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE) ||
(instru.eliteFxn == CURVE_DPV_ADVANCE_SMPRATE)) {
(instru.eliteFxn == CURVE_DPV_ADVANCE_SMPRATE) ||
(instru.eliteFxn == CURVE_CALI))
{
if (!PeriodicEvent) {
finishMode = true;
SendNotify();
@@ -810,11 +693,9 @@ static void vscan_ctrl(uint32_t time)
}
}
static uint32_t OldStep2NewStepTime(uint32_t StepTime){
uint8_t StepTimeLevel = 0;
StepTimeLevel = StepTime / 0x12;
static uint32_t get_step_time(uint8_t StepTime){
switch (StepTimeLevel) {
switch (StepTime) {
case 0: { //0.5 sec
return STEPTIME_HALF_SEC;
}
@@ -178,7 +178,9 @@ static void vo_vscan(void)
return;
}
#define DELTAVOLTMAX 2000000 //2000000 = 10mV
#define DELTAVOLTMAX 20000000 //2000000 = 10mV //10000000 = 50mV //20000000 = 100mV
#define RESISTANCE_100R 1 // 100V/1A = 1[5nV]/50[pA]
static void cc_vscan(void)
{
/* Transform setting CC into IUC
@@ -195,60 +197,173 @@ static void cc_vscan(void)
int32_t deltaV;
int32_t Iin;
int32_t Vin;
int32_t Voutin;
uint8_t cc_cp_speed = instru.cc_cp_speed; // 0:low 1:normal 2:high
// uint8_t cc_resistance = instru.cc_resistance; // 0:vout has 0R 1:vout has 100R
static int32_t i_set = 0;
if (vscanReset) {
Vset = 0;
if (cc->_charge == 0) {
cc->_Iset = instru.constantCurrent * 200 * (-1);
//[50pA] //controller UI 15000uA => Elite 1500000 => 1500000 * 10 * 1000 / 50 [50pA];
i_set = cc->_Iset * (-1);
} else {
i_set = cc->_Iset;
}
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
Vin = m->_measureVin * 200; //[5nV]
Voutin = m->_measureVout * 200; //[5nV]
Vset = Vin + cc->_Iset; //[5nV]
Vset = Voutin + (i_set * RESISTANCE_100R); //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
return;
}
if (!vscanReset) {
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
deltaI = Iin - cc->_Iset;
if (deltaI > 2000000 || deltaI < -2000000) { //100uA
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
deltaI = Iin - i_set;
if (deltaI > 400000 || deltaI < -400000) { //20uA
if (cc_cp_speed == 0) { // 0:low 1:normal 2:high
divisionRate = 100;
} else if (cc_cp_speed == 1) {
divisionRate = 10;
} else {
divisionRate = 1;
}
} else {
if (cc_cp_speed == 0) { // 0:low 1:normal 2:high
divisionRate = 100;
} else if (cc_cp_speed == 1) {
divisionRate = 20;
} else {
divisionRate = 20;
}
}
deltaV = -1 * (deltaI / divisionRate); //-5 * deltaI / 5000 //pV=> 5nV
deltaV = -1 * (deltaI / divisionRate); //-5 * deltaI / 5000 //pV=> 5nV
if (deltaV > DELTAVOLTMAX) { //2000000 = 10mV
deltaV = DELTAVOLTMAX;
} else if (deltaV < (-DELTAVOLTMAX)) {
deltaV = (-DELTAVOLTMAX);
if (deltaV > DELTAVOLTMAX) { //2000000 = 10mV
deltaV = DELTAVOLTMAX;
} else if (deltaV < (-DELTAVOLTMAX)) {
deltaV = (-DELTAVOLTMAX);
}
Vset = Vset + deltaV; //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
Vin = m->_measureVin * 200; //[5nV]
if (Vin <= cc->_Vmin && cc->_charge == 0) { // discharge
PeriodicEvent = false;
} else if (Vin >= cc->_Vmax && cc->_charge == 1) { // charge
PeriodicEvent = false;
}
return;
}
static void cp_vscan(void)
{
struct wm_cp_ctx_t *cp = (struct wm_cp_ctx_t *)wm_get();
struct wm_meas_t *m = &cp->measure;
uint8_t cc_cp_speed = instru.cc_cp_speed; // 0:low 1:normal 2:high
int32_t Iin;
int32_t Voutin;
static uint8_t sum_cnt;
static int64_t sum_adc_delta_Voutin; //[5nV]
static int64_t sum_adc_delta_Iin; //[50pA]
static int32_t resis;
int16_t divisionRate;
static int64_t deltaI;
static int64_t deltaV;
static int32_t i_set;
static int64_t Rd = 0;
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
Voutin = m->_measureVout * 200; //[5nV] uV => 5nV
if (vscanReset) {
sum_cnt = 0;
sum_adc_delta_Voutin = 0;
sum_adc_delta_Iin = 0;
resis = 1000;
if (cp->_charge == 0) { // discharge
i_set = cp->_Iset * (-1);
Vset = Voutin - 1000000; //[5nV] 1000000 = 5mV
} else if(cp->_charge == 1) { // charge
i_set = cp->_Iset;
Vset = Voutin + 1000000; //[5nV] 1000000 = 5mV
}
Vset = Vset + deltaV; //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
if (Vset <= cc->_Vmin) {
Vset = cc->_Vmin;
} else if (Vset >= cc->_Vmax) {
Vset = cc->_Vmax;
return;
}
if (cp_devis_en == TRUE) {
divisionRate = cp_devis;
} else {
if (cc_cp_speed == 0) { // 0:low 1:normal 2:high
divisionRate = 100;
} else if (cc_cp_speed == 1) {
divisionRate = 10;
} else {
divisionRate = 1;
}
}
deltaI = Iin - i_set;
sum_adc_delta_Voutin += Voutin;
sum_adc_delta_Iin += Iin;
sum_cnt++;
if (sum_cnt == 5) {
Rd = sum_adc_delta_Voutin * 100 / sum_adc_delta_Iin;
if ((sum_adc_delta_Iin >= 12000 || sum_adc_delta_Iin <= -12000) && Rd >= 0) { // sum_delIin >= 600nA
if (Rd <= 10) {
resis = 10;
} else if (Rd >= 10000000) {
resis = 10000000;
} else {
resis = Rd;
}
}
sum_cnt = 0;
sum_adc_delta_Voutin = 0;
sum_adc_delta_Iin = 0;
}
deltaV = -1 * deltaI * resis / 100 / (int64_t)divisionRate;
Vset = Vset + deltaV;
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
if (Vset <= cp->_Vmin) {
Vset = cp->_Vmin;
} else if (Vset >= cp->_Vmax) {
Vset = cp->_Vmax;
}
return;
}
@@ -363,8 +478,6 @@ static void lsv_vscan(void)
{
struct wm_lsv_ctx_t *lsv = (struct wm_lsv_ctx_t *)wm_get();
NotifyCycleNumber = (instru.cycleNumber - lsv->_cycleNumber + 1);
if (vscanReset) {
if (instru.directionInit == 1) {
lsv->_direction_up = true;
@@ -698,118 +811,6 @@ static void dpv_advance_vscan(uint32_t time)
return;
}
static void pulse_vscan(void)
{
struct wm_pulse_ctx_t *pulse = (struct wm_pulse_ctx_t *)wm_get();
static uint16_t lastVolt;
if (stiFirstTime) {
stiFirstTime = false;
lastVolt = 25000;
pulse->_sti_t_flag = 1;
pulse->_sti_v = pulse->_sti_v1;
pulse->_sti_t = pulse->_sti_t1;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if(!stiFirstTime) {
if (GPT.StiCounter >= pulse->_sti_t) {
GPT.StiCounter -= pulse->_sti_t; //to get right time
if (pulse->_sti_lp > 0) {
if (pulse->_sti_cy > 0) {
if (pulse->_sti_t_flag == 1) {
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 2) {
pulse->_sti_t_flag = 3;
pulse->_sti_v = pulse->_sti_v3;
pulse->_sti_t = pulse->_sti_t3;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 3) {
pulse->_sti_cy -- ;
if (pulse->_sti_cy == 0) {
pulse->_sti_t_flag = 4;
pulse->_sti_v = pulse->_sti_v4;
pulse->_sti_t = pulse->_sti_t4;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else {
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
}
}
} else if (pulse->_sti_cy <= 0){
if (pulse->_sti_t_flag == 4) {
pulse->_sti_lp -- ;
if (pulse->_sti_lp > 0) {
pulse->_sti_cy = instru.sti_cy;
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else {
pulse->_sti_t_flag = 5;
pulse->_sti_v = pulse->_sti_v5;
pulse->_sti_t = pulse->_sti_t5;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
}
}
}
} else if (pulse->_sti_lp <= 0) {
if (pulse->_sti_t_flag == 5) {
pulse->_sti_t_flag = 6;
pulse->_sti_v = pulse->_sti_v6;
pulse->_sti_t = pulse->_sti_t6;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 6) {
pulse->_sti_t_flag = 7;
pulse->_sti_v = pulse->_sti_v7;
pulse->_sti_t = pulse->_sti_t7;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 7) {
pulse->_sti_v = 25000;
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
}
}
if (lastVolt != pulse->_sti_v) {
lastVolt = pulse->_sti_v;
//if (pulse->_sti_v == 25000) {
// PIN15_setOutputValue(HIGH_Z_MODE, 0); // 1 => close high_z mode
//} else {
// PIN15_setOutputValue(HIGH_Z_MODE, 1); // 1 => close high_z mode
//}
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
}
return;
}
static void chg_vo_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
@@ -50,13 +50,9 @@
#include <xdc/runtime/Error.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26XX.h>
#include <ti/sysbios/BIOS.h>
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>
#include <ti/drivers/dma/UDMACC26XX.h>
#include "icall.h"
#include "hal_assert.h"
@@ -136,7 +132,7 @@ PIN_Handle radCtrlHandle;
extern void AssertHandler(uint8 assertCause, uint8 assertSubcause);
//extern Display_Handle dispHandle;
// extern Display_Handle dispHandle;
/*******************************************************************************
* @fn Main
@@ -251,48 +247,49 @@ int main()
*/
void AssertHandler(uint8 assertCause, uint8 assertSubcause)
{
/*
// Open the display if the app has not already done so
// if ( !dispHandle )
// {
// dispHandle = Display_open(Display_Type_LCD, NULL);
// }
if ( !dispHandle )
{
dispHandle = Display_open(Display_Type_LCD, NULL);
}
// Display_print0(dispHandle, 0, 0, ">>>STACK ASSERT");
Display_print0(dispHandle, 0, 0, ">>>STACK ASSERT");
// check the assert cause
// switch (assertCause)
// {
// case HAL_ASSERT_CAUSE_OUT_OF_MEMORY:
// Display_print0(dispHandle, 0, 0, "***ERROR***");
// Display_print0(dispHandle, 2, 0, ">> OUT OF MEMORY!");
// break;
//
// case HAL_ASSERT_CAUSE_INTERNAL_ERROR:
// // check the subcause
// if (assertSubcause == HAL_ASSERT_SUBCAUSE_FW_INERNAL_ERROR)
// {
// Display_print0(dispHandle, 0, 0, "***ERROR***");
// Display_print0(dispHandle, 2, 0, ">> INTERNAL FW ERROR!");
// }
// else
// {
// Display_print0(dispHandle, 0, 0, "***ERROR***");
// Display_print0(dispHandle, 2, 0, ">> INTERNAL ERROR!");
// }
// break;
//
// case HAL_ASSERT_CAUSE_ICALL_ABORT:
// Display_print0(dispHandle, 0, 0, "***ERROR***");
// Display_print0(dispHandle, 2, 0, ">> ICALL ABORT!");
// HAL_ASSERT_SPINLOCK;
// break;
//
// default:
// Display_print0(dispHandle, 0, 0, "***ERROR***");
// Display_print0(dispHandle, 2, 0, ">> DEFAULT SPINLOCK!");
// HAL_ASSERT_SPINLOCK;
// }
switch (assertCause)
{
case HAL_ASSERT_CAUSE_OUT_OF_MEMORY:
Display_print0(dispHandle, 0, 0, "***ERROR***");
Display_print0(dispHandle, 2, 0, ">> OUT OF MEMORY!");
break;
case HAL_ASSERT_CAUSE_INTERNAL_ERROR:
// check the subcause
if (assertSubcause == HAL_ASSERT_SUBCAUSE_FW_INERNAL_ERROR)
{
Display_print0(dispHandle, 0, 0, "***ERROR***");
Display_print0(dispHandle, 2, 0, ">> INTERNAL FW ERROR!");
}
else
{
Display_print0(dispHandle, 0, 0, "***ERROR***");
Display_print0(dispHandle, 2, 0, ">> INTERNAL ERROR!");
}
break;
case HAL_ASSERT_CAUSE_ICALL_ABORT:
Display_print0(dispHandle, 0, 0, "***ERROR***");
Display_print0(dispHandle, 2, 0, ">> ICALL ABORT!");
HAL_ASSERT_SPINLOCK;
break;
default:
Display_print0(dispHandle, 0, 0, "***ERROR***");
Display_print0(dispHandle, 2, 0, ">> DEFAULT SPINLOCK!");
HAL_ASSERT_SPINLOCK;
}
*/
return;
}