cs1180.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include <string.h>
  2. #include "spi.h"
  3. #include "cs1180.h"
  4. #define CS1180_RDATA 0X01
  5. #define CS1180_RDATAC 0X03
  6. #define CS1180_STOPC 0x0f
  7. #define CS1180_RREG 0x10
  8. #define CS1180_WREG 0x50
  9. #define CS1180_CALSELF 0xf0
  10. #define CS1180_OCALSELF 0xf1
  11. #define CS1180_SLFGCAL 0xf2
  12. #define CS1180_OCALSYS 0xf3
  13. #define CS1180_GCALSYS 0xf4
  14. #define CS1180_WAKEUP 0xfb
  15. #define CS1180_SYNC 0xfc
  16. #define CS1180_SLEEP 0xfd
  17. #define CS1180_RESET 0xfe
  18. #define GAIN 0x07
  19. static void cs1180_write_one_data(uint8_t data);
  20. static uint8_t cs1180_read_one_data(uint8_t data);
  21. static void delay(void)
  22. {
  23. uint32_t count = 3;
  24. while(count--);
  25. }
  26. static void delay_50us(void)
  27. {
  28. uint32_t count = 3*50;
  29. while(count--);
  30. }
  31. static void delay_1ms(int ms){
  32. }
  33. static void spi_write_reg(uint8_t reg, uint8_t *data, uint8_t len){
  34. cs1180_cs(0);
  35. cs1180_write_one_data(CS1180_WREG|reg);
  36. cs1180_write_one_data(len - 1);
  37. while(len -- > 0){
  38. cs1180_write_one_data(*data);
  39. data++;
  40. }
  41. }
  42. #if 0
  43. static void spi_read_reg(uint8_t reg, uint8_t *data, uint8_t len){
  44. cs1180_cs(0);
  45. cs1180_write_one_data(CS1180_RREG|reg);
  46. cs1180_write_one_data(len - 1);
  47. while(len -- > 0){
  48. *data = cs1180_read_one_data(0xFF);
  49. data++;
  50. }
  51. }
  52. #endif
  53. static void cs1180_osalsys(void)
  54. {
  55. cs1180_cs(0);
  56. delay();
  57. cs1180_write_one_data(CS1180_OCALSYS);
  58. delay_50us();
  59. cs1180_cs(1);
  60. }
  61. static void cs1180_calibSelf(void)
  62. {
  63. cs1180_cs(0);
  64. delay();
  65. cs1180_write_one_data(CS1180_CALSELF);
  66. delay_50us();
  67. cs1180_cs(1);
  68. }
  69. void cs1180_init(void){
  70. spi1_init();
  71. delay();
  72. cs1180_cs(0);
  73. cs1180_write_one_data(CS1180_RESET);
  74. delay();
  75. cs1180_cs(1);
  76. cs1180_cs(0);
  77. delay();
  78. /* 0x07 pga =128 设置STEPUP寄存器
  79. * 0x01 设置ad 通道
  80. * 0x02 输出频率 15hz,参考电压2.5V 输出数据高位在前,输入缓冲器除能,采样频率 OSC/128,数据格式双极性
  81. */
  82. uint8_t data[] = {0xF&GAIN, 0x01, 0x00};
  83. spi_write_reg(0x00, data, 3);
  84. delay();
  85. cs1180_cs(1);
  86. delay_50us();
  87. cs1180_calibSelf();
  88. while (IS_CS1180_READY());
  89. while (!IS_CS1180_READY());
  90. delay_1ms(10);
  91. while (IS_CS1180_READY()); //扔调一次数据
  92. cs1180_calibSelf();
  93. //****************************************************
  94. cs1180_osalsys();
  95. while (IS_CS1180_READY());
  96. while (!IS_CS1180_READY());
  97. delay_1ms(10);
  98. while (IS_CS1180_READY()); //扔调一次数据
  99. cs1180_osalsys();
  100. //****************************************************
  101. delay_1ms(500);
  102. //**************************************************************************/
  103. while (IS_CS1180_READY());
  104. }
  105. //adc/2^19/128*1.25/0.001
  106. int32_t Cal_Current(uint32_t adc,uint8_t fh )
  107. {
  108. #if 0
  109. const uint32_t jing_du = 0x0007FFFF;
  110. uint8_t zeng_yi = 128;//(g_zeng_yi<<7);
  111. double vrf_v = 123500000.0/RSENSE_VAL;// 1.25*1000,dianzu 1mo*100,*1000ma
  112. int32_t cur = 0;
  113. cur = (int32_t)((double)adc/jing_du/zeng_yi*vrf_v);
  114. if(fh == 1)
  115. cur = 0 - cur;
  116. return cur;
  117. #else
  118. return 0;
  119. #endif
  120. }
  121. /**************************************************************************************
  122. *函数原型: unsigned long ReadAdData(void)
  123. *功能: 从CS1160中读取ad转换结果,并将结果以长整型数据返回
  124. **************************************************************************************/
  125. int32_t ReadAdData(void)
  126. {
  127. uint8_t i,fh = 0;
  128. uint8_t Buf_rev[3];
  129. uint32_t a;
  130. while (IS_CS1180_READY()); //当drdy 为高时,不读取数据
  131. a = 0;
  132. cs1180_cs(0);
  133. cs1180_write_one_data(CS1180_RDATA); //0X01
  134. //for (i=0;i<5;i++)
  135. {
  136. delay_50us();
  137. }
  138. for (i=0;i<3;i++)
  139. {
  140. Buf_rev[i] = cs1180_read_one_data(0xFF);
  141. }
  142. cs1180_cs(1);
  143. a = Buf_rev[0];
  144. a = a<<8;
  145. a |= Buf_rev[1];
  146. a = a<<8;
  147. a |= Buf_rev[2];
  148. a>>=4;
  149. if(a >= 0x80000)
  150. {
  151. a = ~a;
  152. a = a&0x7FFFF;
  153. fh = 1;
  154. }
  155. return Cal_Current(a,fh) - 5;
  156. }
  157. static void cs1180_write_one_data(uint8_t data){
  158. spi1_send_byte(data, NULL);
  159. }
  160. static uint8_t cs1180_read_one_data(uint8_t data){
  161. uint8_t r_data = 0xFF;
  162. spi1_send_byte(data, &r_data);
  163. return r_data;
  164. }