cs1180.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. cs1180_write_one_data(CS1180_OCALSYS);
  57. cs1180_cs(1);
  58. }
  59. static void cs1180_calibSelf(void)
  60. {
  61. cs1180_cs(0);
  62. cs1180_write_one_data(CS1180_CALSELF);
  63. cs1180_cs(1);
  64. }
  65. void cs1180_init(void){
  66. spi1_init();
  67. delay();
  68. cs1180_cs(0);
  69. cs1180_write_one_data(CS1180_RESET);
  70. delay();
  71. cs1180_cs(1);
  72. cs1180_cs(0);
  73. delay();
  74. /* 0x07 pga =128 设置STEPUP寄存器
  75. * 0x01 设置ad 通道
  76. * 0x02 输出频率 15hz,参考电压2.5V 输出数据高位在前,输入缓冲器除能,采样频率 OSC/128,数据格式双极性
  77. */
  78. uint8_t data[] = {0xF&GAIN, 0x01, 0x00};
  79. spi_write_reg(0x00, data, 3);
  80. delay();
  81. cs1180_cs(1);
  82. delay_50us();
  83. cs1180_calibSelf();
  84. while (IS_CS1180_READY());
  85. while (!IS_CS1180_READY());
  86. delay_1ms(10);
  87. while (IS_CS1180_READY()); //扔调一次数据
  88. cs1180_calibSelf();
  89. //****************************************************
  90. cs1180_osalsys();
  91. while (IS_CS1180_READY());
  92. while (!IS_CS1180_READY());
  93. delay_1ms(10);
  94. while (IS_CS1180_READY()); //扔调一次数据
  95. cs1180_osalsys();
  96. //****************************************************
  97. delay_1ms(500);
  98. //**************************************************************************/
  99. while (IS_CS1180_READY());
  100. }
  101. //adc/2^19/128*1.25/0.001
  102. int32_t Cal_Current(uint32_t adc,uint8_t fh )
  103. {
  104. #if 0
  105. const uint32_t jing_du = 0x0007FFFF;
  106. uint8_t zeng_yi = 128;//(g_zeng_yi<<7);
  107. double vrf_v = 123500000.0/RSENSE_VAL;// 1.25*1000,dianzu 1mo*100,*1000ma
  108. int32_t cur = 0;
  109. cur = (int32_t)((double)adc/jing_du/zeng_yi*vrf_v);
  110. if(fh == 1)
  111. cur = 0 - cur;
  112. return cur;
  113. #else
  114. return 0;
  115. #endif
  116. }
  117. /**************************************************************************************
  118. *函数原型: unsigned long ReadAdData(void)
  119. *功能: 从CS1160中读取ad转换结果,并将结果以长整型数据返回
  120. **************************************************************************************/
  121. int32_t ReadAdData(void)
  122. {
  123. uint8_t i,fh = 0;
  124. uint8_t Buf_rev[3];
  125. uint32_t a;
  126. while (IS_CS1180_READY()); //当drdy 为高时,不读取数据
  127. a = 0;
  128. cs1180_cs(0);
  129. cs1180_write_one_data(CS1180_RDATA); //0X01
  130. //for (i=0;i<5;i++)
  131. {
  132. delay_50us();
  133. }
  134. for (i=0;i<3;i++)
  135. {
  136. Buf_rev[i] = cs1180_read_one_data(0xFF);
  137. }
  138. cs1180_cs(1);
  139. a = Buf_rev[0];
  140. a = a<<8;
  141. a |= Buf_rev[1];
  142. a = a<<8;
  143. a |= Buf_rev[2];
  144. a>>=4;
  145. if(a >= 0x80000)
  146. {
  147. a = ~a;
  148. a = a&0x7FFFF;
  149. fh = 1;
  150. }
  151. return Cal_Current(a,fh) - 5;
  152. }
  153. static void cs1180_write_one_data(uint8_t data){
  154. spi1_send_byte(data, NULL);
  155. }
  156. static uint8_t cs1180_read_one_data(uint8_t data){
  157. uint8_t r_data = 0xFF;
  158. spi1_send_byte(data, &r_data);
  159. return r_data;
  160. }