ADS1255 懂的朋友进来下。

[复制链接]
4208|0
 楼主| twins7713 发表于 2013-5-29 16:03 | 显示全部楼层 |阅读模式
本帖最后由 twins7713 于 2013-5-29 16:03 编辑

  1. #include "ADS1255.h"
  2. #include "math.h"
  3. #include "misc.h"
  4. #include "mmc_sd.h"
  5. #include "stm32f10x_gpio.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. float snow,snow1;
  9. uchar date1,date2,date3;
  10. uchar date4,date5,date6,date7,date8,date9;      
  11. unsigned long snow2,snow3,snow4,snow5,snow6;                  
  12. void PORT_Init (void);
  13. char Read_Register(char Addr);
  14. void Write_Register(char Addr,char data);
  15. void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data);
  16. uchar MYADS1255_read_reg(uchar ADS1255_command);
  17. void ADS1255_write_bit(uchar temp);
  18. uchar ADS1255_read_bit(void);
  19. void MYADS1255_RDATAC(void);
  20. void delayus(uchar i);
  21. void delayms(uchar k);
  22. void delayad(void);
  23. void MYADS1255_SELFCAL(void);
  24. void MYADS1255_init(void);
  25. void MYADS1255_out_reg(void);
  26. void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data);
  27. /****************************************
  28. 功能描述:微秒可控延时
  29. 设计人:孙占山
  30. 说明:进行微秒延时,注意while(--i),不能为while(i--)
  31. *****************************************/
  32. void delayus(uchar i)        
  33. {
  34. while(--i);
  35. }
  36. /****************************************
  37. 功能描述:毫可控秒延时
  38. 设计人:孙占山
  39. 说明:进行毫秒延时,可以改变时间
  40. *****************************************/
  41. void delayms(uchar k)
  42. {
  43. uchar i,j;
  44. for(i=0;i<k;i++)
  45.   for(j=0;j<248;j++);
  46.    
  47. }
  48. void delayad(void)
  49. {
  50. unsigned long i = 10;
  51.     while(i--);
  52.   }
  53. void ADS1255_write_bit(uchar temp)
  54. {
  55. uchar i;
  56. SetADS1255_CLK;
  57. for(i=0;i<8;i++)
  58. {
  59.   SetADS1255_CLK;
  60.   delayus(248);
  61.   ClrADS1255_CLK;   
  62.   delayus(248);
  63.   GPIO_WriteBit( GPIOA , GPIO_Pin_9 , ( (temp&0x80)>>7) ); //在下降沿的时候写入数据//GPIO_Write
  64.   delayus(248);
  65.   SetADS1255_CLK;
  66.   delayus(248);
  67.   temp=temp<<1;
  68.   }
  69. }
  70. /****************************************
  71. 功能描述:ADS1255单字节读出
  72. 设计人:孙占山
  73. 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了
  74. 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定)
  75. *****************************************/
  76. uchar ADS1255_read_bit(void)
  77. {
  78. uchar i;
  79. uchar date;
  80. SetADS1255_CLK;
  81. ClrADS1255_IN;
  82. for(i=0;i<8;i++)
  83. {
  84.   date=date<<1;
  85.   SetADS1255_CLK;
  86.   delayus(50);
  87.   ClrADS1255_CLK;
  88.   delayus(50);
  89.   date=date|GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10);//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可
  90.   SetADS1255_CLK;
  91.   }
  92.   return date;
  93. }
  94. /****************************************
  95. 功能描述:ADS1255寄存器设置初始化
  96. 设计人:孙占山
  97. 说明:1:自校准可以通过写STATUS寄存器的ACAL位,还可以通过写SELFCAL命令来自校准
  98.      2:使能自校准,在写寄存器ADCON(PGA),DRATE(DR),STATUS(BUFEN)自动校准
  99.   3:在STATUS(BUFEN)与ACAL(自校准)位一起使能时,读出校准寄存器有错
  100. *****************************************/
  101. void MYADS1255_init(void)
  102. {
  103. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  104. MYADS1255_write_reg(ADS1255_STATUS,0xf4);
  105. delayus(1);
  106. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);   
  107. MYADS1255_write_reg(ADS1255_MUX,0x08);
  108. delayus(1);
  109. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  110. MYADS1255_write_reg(ADS1255_ADCON,0x00);
  111. delayus(1);
  112. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  113. MYADS1255_write_reg(ADS1255_DRATE,0xf0);
  114. delayus(1);
  115. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  116. MYADS1255_write_reg(ADS1255_IO,0x00);
  117. delayus(1);
  118. }
  119. void MYADS1255_out_reg(void)
  120. {
  121.    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  122.    date4=MYADS1255_read_reg(0x15);
  123.    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  124.    date5=MYADS1255_read_reg(0x16);
  125.    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  126.    date6=MYADS1255_read_reg(0x17);
  127.    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  128.    date7=MYADS1255_read_reg(0x18);
  129.    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  130.    date8=MYADS1255_read_reg(0x19);
  131.    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
  132.    date9=MYADS1255_read_reg(0x1a);
  133. }
  134. char Read_Register(char Addr)
  135. {
  136.   char data;
  137.   char Command=0;
  138.   Command|=0x40;
  139.   Addr&=0x0f;
  140.   Command|=Addr;
  141.   
  142.    SPI_ReadWriteByte(Command);
  143.    data=SPI_ReadWriteByte(0x55);
  144.   return (data);
  145. }
  146. void Write_Register(char Addr,char data)
  147. {
  148.   char Command=0;
  149.   Command|=0x60;
  150.   Addr&=0x0F;
  151.   Command|=Addr;
  152.    SPI_ReadWriteByte(Command);
  153.    SPI_ReadWriteByte(data);
  154. }
  155. /****************************************
  156. 功能描述:ADS1255写寄存器
  157. 设计人:孙占山
  158. 说明:根据要求写入寄存器和命令字
  159. *****************************************/
  160. void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data)
  161. {
  162. ADS1255_write_bit(ADS1255_command);
  163. ADS1255_write_bit(0x50);    //ADS1255_Write_Byte(0x00);
  164. ADS1255_write_bit(ADS1255_data);
  165. delayms(248);
  166. }
  167. /****************************************
  168. 功能描述:ADS1255读寄存器
  169. 设计人:孙占山
  170. 说明:根据要求写入寄存器和命令字
  171. *****************************************/
  172. uchar MYADS1255_read_reg(uchar ADS1255_command)
  173. {
  174. uchar reg_date;
  175. ADS1255_write_bit(ADS1255_command);
  176. ADS1255_write_bit(0x10);    //ADS1255_Write_Byte(0x00);
  177. delayus(50);
  178. reg_date=ADS1255_read_bit();
  179. return reg_date;
  180. }
  181. /****************************************
  182. 功能描述:ADS1255唤醒
  183. 设计人:孙占山
  184. 说明:唤醒待机和同步
  185. *****************************************/
  186. void MYADS1255_WAKEUP(void)
  187. {
  188. ADS1255_write_bit(0x00);
  189. }
  190. /****************************************
  191. 功能描述:ADS1255读一次数据命令
  192. 设计人:孙占山
  193. 说明:在DRDY为低时读出一个数据
  194. *****************************************/
  195. void MYADS1255_RDATA(void)
  196. {
  197. ADS1255_write_bit(0x01);
  198. }
  199. /****************************************
  200. 功能描述:ADS1255连续数据命令
  201. 设计人:孙占山
  202. 说明:在DRDY为低时连续读出数据
  203. *****************************************/
  204. void MYADS1255_RDATAC(void)
  205. {
  206. ADS1255_write_bit(0x03);
  207. }
  208. /****************************************
  209. 功能描述:ADS1255停止连续数据命令
  210. 设计人:孙占山
  211. 说明:在ADS1255连续输出24位当中的任何八位时写入,停止连续读数据
  212. *****************************************/
  213. void MYADS1255_SDATAC(void)
  214. {
  215. ADS1255_write_bit(0x0F);
  216. }
  217. /****************************************
  218. 功能描述:偏移和增益自校准
  219. 设计人:孙占山
  220. 说明:偏移和增益自校准,也可以用STATUS寄存器中的ACAL来自校准
  221. *****************************************/
  222. void MYADS1255_SELFCAL(void)
  223. {
  224. ADS1255_write_bit(0xf0);
  225. }
  226. /****************************************
  227. 功能描述:同步
  228. 设计人:孙占山
  229. 说明:同步用在命令的开始快速执行,紧接着用WAKE UP命令进行同步
  230. *****************************************/
  231. void MYADS1255_SYNC(void)
  232. {
  233. ADS1255_write_bit(0xfc);
  234. }
  235. /****************************************
  236. 功能描述:复位
  237. 设计人:孙占山
  238. 说明:复位后不管ACAL位如何,都执行一个自校准
  239. *****************************************/
  240. void MYADS1255_RESET(void)
  241. {
  242. ADS1255_write_bit(0xfe);
  243. }
  244. /****************************************
  245. 功能描述:ADS1255的24位数据分三次读出
  246. 设计人:孙占山
  247. 说明:1:ADS1255是24位的AD转换器,24位数据可以分三个八位读出,然后再经过公式算出结果
  248.      2:公式有两种,一种是左移右移,一种是date1*65536+snow2*256+snow3
  249.   3:注意公式左移时不好,因为左移有进位,这样可能数据会变化,一般尽量采取右移
  250. *****************************************/
  251. float MYADS1255_read(void)
  252. {
  253. date1=ADS1255_read_bit();
  254. date2=ADS1255_read_bit();
  255. date3=ADS1255_read_bit();
  256. //snow=((((snow|date1)<<8)|date2)<<8)|date3;
  257. //snow=snow<<8;
  258. snow=date1*65536+date2*256+date3;
  259. return snow;
  260. }
  1. #include "math.h"
  2. #include "misc.h"


  3. /*Registers' Address*/
  4. #define REG_STATUS 0
  5. #define REG_MUX 1
  6. #define REG_ADCON 2
  7. #define REG_DRATE 3
  8. #define REG_IO 4
  9. #define REG_OFC0 5
  10. #define REG_OFC1 6
  11. #define REG_OPC2 7
  12. #define REG_FSC0 8
  13. #define REG_FSC1 9
  14. #define REG_FSC2 10

  15. #define ADS1255_STATUS 0x00 //状态寄存器(ADDRESS 00h)
  16. #define ADS1255_MUX 0x01 //模拟多路选择控制器(Address 01h)
  17. #define ADS1255_ADCON 0x02 //AD控制寄存器 (Address 02h)
  18. #define ADS1255_DRATE 0x03 //AD数据速度寄存器(Address 03h)
  19. #define ADS1255_IO 0x04 //i/o控制寄存器(Address 04H)
  20. #define ADS1255_OFC0 0x05 //Offset Calibration Byte 0, least significant byte (Address 05h)
  21. #define ADS1255_OFC1 0x06 //Offset Calibration Byte 1 (Address 06h)
  22. #define ADS1255_OFC2 0x07 //Offset Calibration Byte 2, most significant byte (Address 07h)
  23. #define ADS1255_FSC0 0x08 //Full.scale Calibration Byte 0, least significant byte (Address 08h)
  24. #define ADS1255_FSC1 0x09 //Full.scale Calibration Byte 1 (Address 09h)
  25. #define ADS1255_FSC2 0x0a //Full.scale Calibration Byte 2, most significant byte (Address 0Ah)

  26. /*Operation Command*/

  27. //#define ADS1255_WAKEUP 0x00 //Completes SYNC and Exits Standby Mode
  28. #define ADS1255_RDATA 0x01 //单次读取数据
  29. #define ADS1255_RDATAC 0x03 //连续读取数据
  30. #define ADS1255_SDATAC 0x0f //停止连续读数据
  31. #define ADS1255_RREG 0x10 //从寄存器中读取数据Read from REG rrr 0001 rrrr (1xh) 0000 nnnn
  32. #define ADS1255_WREG 0x50 //向寄存器中写入数据Write to REG rrr 0101 rrrr (5xh) 0000 nnnn
  33. #define ADS1255_SELFCAL 0xf0 //补偿和增益自我校准Offset and Gain Self-Calibration
  34. #define ADS1255_SELFOCAL 0xf1 //补偿自我校准Offset Self-Calibration
  35. #define ADS1255_SELFGCAL 0xf2 //增益自我校准Gain Self-Calibration
  36. #define ADS1255_SYSOCAL 0xf3 //系统补偿校准System Offset Calibration
  37. #define ADS1255_SYSGCAL 0xf4 //系统增益校准System Gain Calibration
  38. #define ADS1255_SYNC 0xfc //使ad转换同步Synchronize the A/D Conversion
  39. #define ADS1255_STANDBY 0xfd //启动待机模式Begin Standby Mode
  40. #define ADS1255_RESET 0xfe //重置升高值Reset to Power-Up Values
  41. #define ADS1255_WAKEUP 0xff //结束退出待机模式Completes SYNC and Exits Standby Mode

  42. #define SetADS1255_OUT GPIOA->BRR = GPIO_Pin_9 //0
  43. #define SetADS1255_IN GPIOA->BRR = GPIO_Pin_10
  44. #define SetADS1255_DRDY GPIOA->BRR = GPIO_Pin_11
  45. #define SetADS1255_CLK GPIOB->BRR = GPIO_Pin_5

  46. #define ClrADS1255_OUT GPIOA->BSRR = GPIO_Pin_9 //1
  47. #define ClrADS1255_IN GPIOA->BSRR = GPIO_Pin_10
  48. #define ClrADS1255_DRDY GPIOA->BSRR = GPIO_Pin_11
  49. #define ClrADS1255_CLK GPIOB->BSRR = GPIO_Pin_5


这是我结合别人例子写的ADS1255配置,但是就是采不出数据,到底是哪里有错呀?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

29

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部