关于温度采集芯片Max31856无法写数据

2020-03-07 17:52发布

  1. #include<thermocouple.h>
  2. #include<stc15.h>
  3. #include<stdio.h>
  4. #include<intrins.h>
  5. sbit Max31856_CS= P1^2;
  6. sbit Max31856_SDO=P1^3;
  7. sbit Max31856_SDI=P1^4;
  8. sbit Max31856_CLK=P1^5;
  9. long WenDu_Dat;
  10. uint WenDu;
  11. uchar WenDu_Time,Error;
  12. void Max31856_Delay700ms()                //@24.000MHz
  13. {
  14.         unsigned char i, j, k;

  15.         _nop_();
  16.         _nop_();
  17.         i = 183;
  18.         j = 100;
  19.         k = 225;
  20.         do
  21.         {
  22.                 do
  23.                 {
  24.                         while (--k);
  25.                 } while (--j);
  26.         } while (--i);
  27. }

  28. void Max31856_Delay()
  29. {
  30.         _nop_();
  31.         _nop_();
  32.         _nop_();
  33. }
  34. void Max31856_WriteByte(uchar Add,Dat)
  35. {
  36.         uchar i;
  37.         Max31856_CLK=1;
  38.         Max31856_CS=0;
  39.         Max31856_Delay();
  40.         for(i=0;i<8;i++)
  41.         {
  42.                 Max31856_CLK=0;
  43.                 Max31856_Delay();
  44.                 Add<<=1;
  45.                 Max31856_SDO=CY;
  46.                 Max31856_Delay();
  47.                 Max31856_CLK=1;
  48.                 Max31856_Delay();
  49.         }
  50.         for(i=0;i<8;i++)
  51.         {
  52.                 Max31856_CLK=0;
  53.                 Max31856_Delay();
  54.                 Dat<<=1;
  55.                 Max31856_SDO=CY;
  56.                 Max31856_Delay();
  57.                 Max31856_CLK=1;
  58.                 Max31856_Delay();
  59.         }
  60.         Max31856_CS=1;
  61. }
  62. uchar Max31856_ReadByte(uchar Add)
  63. {
  64.         uchar i,Dat;
  65.         Max31856_CLK=1;
  66.         Max31856_CS=0;
  67.         Max31856_Delay();
  68.         for(i=0;i<8;i++)
  69.         {
  70.                 Max31856_CLK=0;
  71.                 Max31856_Delay();
  72.                 Add<<=1;
  73.                 Max31856_SDO=CY;
  74.                 Max31856_Delay();
  75.                 Max31856_CLK=1;
  76.                 Max31856_Delay();
  77.         }
  78.         for(i=0;i<8;i++)
  79.         {
  80.                 Max31856_CLK=0;
  81.                 Max31856_Delay();
  82.                 Dat<<=1;
  83.                 Dat|=Max31856_SDI;
  84.                 Max31856_CLK=1;
  85.                 Max31856_Delay();
  86.         }
  87.         Max31856_CS=1;
  88.         return Dat;
  89. }
  90. void Max31856_ReadTemp()
  91. {
  92.         uchar i,Add;
  93.         Max31856_CLK=1;
  94.         Max31856_CS=0;
  95.         Max31856_Delay();
  96.         Add=0x0c;
  97.         for(i=0;i<8;i++)
  98.         {       
  99.                 Max31856_CLK=0;
  100.                 Max31856_Delay();
  101.                 Add<<=1;
  102.                 Max31856_SDO=CY;
  103.                 Max31856_Delay();
  104.                 Max31856_CLK=1;
  105.                 Max31856_Delay();
  106.         }
  107.         for(i=0;i<24;i++)
  108.         {
  109.                 Max31856_CLK=0;
  110.                 Max31856_Delay();
  111.                 WenDu_Dat<<=1;
  112.                 WenDu_Dat|=Max31856_SDI;
  113.                 Max31856_CLK=1;
  114.                 Max31856_Delay();
  115.         }
  116.         Max31856_CS=1;
  117.         WenDu=WenDu_Dat*Hot+0.5;
  118. }
  119. void Max31856_Read_Error()
  120. {
  121.          Error=Max31856_ReadByte(SR_Read);
  122.          if(CJ_Range)
  123.          {
  124.                  printf("热电偶超出正常工作范围 ");
  125.          }
  126.          if(OVUV)
  127.          {
  128.                  printf("热电偶过压或欠压 ");
  129.          }
  130.          while(CJ_Open)                                                                          //如果热电偶断开了,就一直等待热电偶连接
  131.          {
  132.                  printf("热电偶已经断开 ");
  133.                 Max31856_Delay700ms();                                                                //等待温度转换完成
  134.                 Error=Max31856_ReadByte(SR_Read);                                        //读取故障寄存器
  135.          }
  136. }
  137. void Max31856_Init()
  138. {
  139.         Max31856_WriteByte(CR1_Write,(AVGSEL&TC_Type_K));                        //CR1寄存器16位采样,K型热电偶
  140.         Max31856_WriteByte(MASK_Write,MASK_Set);                                        //屏蔽所有故障输出
  141.         Max31856_WriteByte(0x81,0x48);                                                //开启转换
  142.         Max31856_Delay700ms();                                                                //等待温度转换完成
  143. }
复制代码
我用读寄存器数据完全正常,只要对哪个寄存器写数据,那个寄存器的数据就会变成0,就好像把数据给他写成0了一样,但是读数据的时候,先写地址,再读数据,也是正常的。哪位大神9命,难道是芯片有问题吗?写不了数据,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。