久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7105|回復: 8
打印 上一主題 下一主題
收起左側

STM32 CS1237庫函數程序分享

  [復制鏈接]
跳轉到指定樓層
樓主
ID:819974 發表于 2020-12-2 13:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "stm32f10x.h"
  2. #include "uart.h"
  3. #include "cs1237.h"



  4. // 程序運行在STM32F103系列 主頻72MHz
  5. // CS1237程序要注意的兩個時序問題:
  6. // 1.CLK拉低以后 要等待300ms OUT引腳才會自動變低
  7. // 2.CLK的時鐘頻率最大是1.1Mhz 所以CLK=1和CLK=0之間 要加入至少0.5us的延時

  8. /**
  9.   * @brief  Main program.
  10.   * @param  None
  11.   * @retval None
  12.   */
  13. int main(void)
  14. {
  15.         int32_t temp;
  16.         
  17.         USART1_Init(); // 初始化串口1 波特率9600
  18.         CS1237_Init_JX();
  19.         delay_ms(300);
  20.         CS1237_Config();
  21.         delay_ms(100);
  22.         USART1_Send_byte(Read_Config());
  23.         
  24.   while (1)
  25.   {
  26.                 delay_ms(1000);
  27.                 temp = Read_CS1237();//讀取CS1237的數據
  28.                 printf("%d\r\n", temp);// 把讀取到的數據發送到串口
  29.   }
  30. }
復制代碼
  1. #include "cs1237.h"
  2. #include "uart.h"



  3. //OUT引腳輸入輸出 方向設置  PA3
  4. #define OUT_IN()  {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;}
  5. #define OUT_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;}

  6. // PA2-----CLK
  7. // PA3-----OUT

  8. void Delay1us(void)
  9. {
  10.         __IO uint32_t t=5;
  11.         
  12.         while(t--);
  13. }

  14. void Delay1ms(void)
  15. {
  16.         __IO uint32_t t=8000;
  17.         
  18.         while(t--);
  19. }

  20. void delay_ms(__IO uint16_t ms)
  21. {
  22.         do{
  23.                 Delay1ms();
  24.         }while(ms--);
  25. }

  26. // 初始化PA2 PA3
  27. // PA2-----CLK
  28. // PA3-----OUT
  29. void CS1237_Init_JX(void)
  30. {        
  31.         GPIO_InitTypeDef  GPIO_InitStructure;                                       
  32.         
  33.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
  34.         
  35.         // PA2 ----- CLK  設置為輸出
  36.         // PA3 ----- OUT  設置為輸出
  37.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;               
  38.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  39.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  40.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  41.                
  42.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK拉高
  43.         GPIO_SetBits(GPIOA, GPIO_Pin_3);        // OUT拉高
  44. }

  45. //配置CS1237芯片
  46. void CS1237_Config(void)
  47. {
  48.         unsigned char i;
  49.         unsigned char dat;
  50.         unsigned int count_i=0;//溢出計時器
  51.         
  52.         dat = 0X0C;   //芯片地配置 內部REF 輸出40HZ PGA=128 通道A 0X1C   
  53.         OUT_OUT();
  54.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引腳拉高
  55.         OUT_IN();
  56.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);// 時鐘拉低
  57.         while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1) //等待CS237準備好
  58.         {
  59.                 delay_ms(1);
  60.                 count_i++;
  61.                 if(count_i > 300)
  62.                 {
  63.                         OUT_OUT();
  64.                         GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT引腳拉高
  65.                         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK引腳拉高
  66.                         return;//超時,則直接退出程序
  67.                 }
  68.         }
  69.         for(i=0;i<29;i++)// 1 - 29
  70.         {
  71.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  72.                 Delay1us();
  73.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  74.                 Delay1us();
  75.         }
  76.         OUT_OUT();
  77.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//30
  78.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//31
  79.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//32
  80.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//33
  81.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//34
  82.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//35
  83.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//36
  84.         //37     寫入了0x65
  85.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  86.         Delay1us();
  87.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  88.         Delay1us();
  89.         
  90.         for(i=0;i<8;i++)// 38 - 45個脈沖了,寫8位數據
  91.         {
  92.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  93.                 Delay1us();
  94.                 if(dat&0x80)
  95.                         GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
  96.                 else
  97.                         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  98.                 dat <<= 1;
  99.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  100.                 Delay1us();
  101.         }
  102.         GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
  103.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  104.         Delay1us();
  105.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  106.         Delay1us();
  107. }

  108. // 讀取芯片的配置數據
  109. unsigned char Read_Config(void)
  110. {
  111.         unsigned char i;
  112.         unsigned char dat=0;//讀取到的數據
  113.         unsigned char count_i=0;//溢出計時器
  114. //        unsigned char k=0,j=0;//中間變量
  115.         
  116.         OUT_OUT();
  117.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引腳拉高
  118.         OUT_IN();
  119.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);//時鐘拉低
  120.         while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片準備好數據
  121.         {
  122.                 delay_ms(1);
  123.                 count_i++;
  124.                 if(count_i > 300)
  125.                 {
  126.                         OUT_OUT();
  127.                         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  128.                         GPIO_SetBits(GPIOA, GPIO_Pin_3);        // OUT=1;
  129.                         return 1;//超時,則直接退出程序
  130.                 }
  131.         }

  132.         for(i=0;i<29;i++)// 產生第1到29個時鐘
  133.         {
  134.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  135.                 Delay1us();
  136.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  137.                 Delay1us();
  138.         }
  139.         
  140.         OUT_OUT();
  141.         
  142.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  143.         Delay1us();
  144.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  145.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  146.         Delay1us();// 這是第30個時鐘
  147.         
  148.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  149.         Delay1us();
  150.         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  151.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  152.         Delay1us();// 這是第31個時鐘
  153.         
  154.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  155.         Delay1us();
  156.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  157.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  158.         Delay1us();//32
  159.         
  160.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  161.         Delay1us();
  162.         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  163.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  164.         Delay1us();//33
  165.         
  166.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  167.         Delay1us();
  168.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  169.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  170.         Delay1us();//34
  171.         
  172.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  173.         Delay1us();
  174.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  175.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  176.         Delay1us();//35
  177.         
  178.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  179.         Delay1us();
  180.         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  181.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  182.         Delay1us();//36
  183.         
  184.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  185.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  186.         Delay1us();
  187.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  188.         Delay1us();//37     寫入0x56 即讀命令
  189.         
  190.         dat=0;
  191.         OUT_IN();
  192.         for(i=0;i<8;i++)// 第38 - 45個脈沖了,讀取數據
  193.         {
  194.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  195.                 Delay1us();
  196.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  197.                 Delay1us();
  198.                 dat <<= 1;
  199.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
  200.                         dat++;
  201.         }
  202.         
  203.         //第46個脈沖
  204.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  205.         Delay1us();
  206.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  207.         Delay1us();
  208.         
  209.         OUT_OUT();
  210.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引腳拉高
  211.         
  212.         return dat;
  213. }

  214. //讀取ADC數據,返回的是一個有符號數據
  215. int32_t Read_CS1237(void)
  216. {
  217.         unsigned char i;
  218.         uint32_t dat=0;//讀取到的數據
  219.         unsigned char count_i=0;//溢出計時器
  220.         int32_t temp;
  221.         
  222.         OUT_OUT();
  223.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引腳拉高
  224.         OUT_IN();
  225.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);//時鐘拉低
  226.         while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片準備好數據
  227.         {
  228.                 delay_ms(1);
  229.                 count_i++;
  230.                 if(count_i > 300)
  231.                 {
  232.                         OUT_OUT();
  233.                         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  234.                         GPIO_SetBits(GPIOA, GPIO_Pin_3);        // OUT=1;
  235.                         return 1;//超時,則直接退出程序
  236.                 }
  237.         }
  238.         
  239.         dat=0;
  240.         for(i=0;i<24;i++)//獲取24位有效轉換
  241.         {
  242.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  243.                 Delay1us();
  244.                 dat <<= 1;
  245.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
  246.                         dat ++;
  247.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  248.                 Delay1us();
  249.         }
  250.         
  251.         for(i=0;i<3;i++)//接著前面的時鐘 再來3個時鐘
  252.         {
  253.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  254.                 Delay1us();
  255.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  256.                 Delay1us();
  257.         }
  258.         
  259.         OUT_OUT();
  260.         GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT = 1;
  261.         
  262.         if(dat&0x00800000)// 判斷是負數 最高位24位是符號位
  263.         {
  264.                 temp=-(((~dat)&0x007FFFFF) + 1);// 補碼變源碼
  265.         }
  266.         else
  267.                 temp=dat; // 正數的補碼就是源碼
  268.         
  269.         return temp;
  270. }
復制代碼


STM32-CS1237.7z

177.74 KB, 下載次數: 160, 下載積分: 黑幣 -5

評分

參與人數 2黑幣 +80 收起 理由
咸魚頭 + 30 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:817309 發表于 2021-3-18 13:07 | 只看該作者
有用,感謝樓主
回復

使用道具 舉報

板凳
ID:900714 發表于 2021-4-5 10:13 | 只看該作者
1、讀取芯片的配置數據,這個函數其實是可以不用調用的是吧?
2、您這個被測試信號很小?要不然增益怎么設定為128?如果我測試的信號為1-5V,基準源為5V,是否在這基礎上設為1就可以了?有其它需要改動的嗎?
回復

使用道具 舉報

地板
ID:900714 發表于 2021-4-5 10:22 | 只看該作者
接上貼:
3、這個代碼測試可用嗎?在int32_t Read_CS1237(void)中,                if(count_i > 300)這個判斷總是為假,進不了時鐘和數據IO操作代碼。因為count_i是8位的unsigned char,計數不可能超過256呀。

盼回復。感謝 分享
回復

使用道具 舉報

5#
ID:819974 發表于 2021-7-15 02:32 | 只看該作者
wskfengliu 發表于 2021-4-5 10:22
接上貼:
3、這個代碼測試可用嗎?在int32_t Read_CS1237(void)中,                if(count_i > 300)這個判斷總是為假 ...

就直接初始化IO口,然后在調用讀取函數,用個變量去存取
回復

使用道具 舉報

6#
ID:819974 發表于 2021-7-22 17:00 | 只看該作者
wskfengliu 發表于 2021-4-5 10:22
接上貼:
3、這個代碼測試可用嗎?在int32_t Read_CS1237(void)中,                if(count_i > 300)這個判斷總是為假 ...

前面看了下這個問題,這個你只需要把count_i給改成unsigned int就可以了
回復

使用道具 舉報

7#
ID:819974 發表于 2021-7-22 17:01 | 只看該作者
wskfengliu 發表于 2021-4-5 10:13
1、讀取芯片的配置數據,這個函數其實是可以不用調用的是吧?
2、您這個被測試信號很小?要不然增益怎么設 ...

讀取和配置數據看情況,一般多是默認的,所以可以不用,被測信號的話我用的是電子秤,一般來說信號還是變化很大的
回復

使用道具 舉報

8#
ID:485367 發表于 2021-8-18 16:55 | 只看該作者
感謝分享,驗證過的外設驅動很有用,可以節省項目時間
回復

使用道具 舉報

9#
ID:1117044 發表于 2024-4-17 18:38 | 只看該作者
感謝樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费的黄色片子 | 欧美极品在线观看 | 久久蜜桃资源一区二区老牛 | 亚洲成人国产 | 日韩在线视频精品 | 国产欧美精品区一区二区三区 | 亚洲情侣视频 | 在线视频一区二区三区 | 久久精品国产一区二区电影 | 精品久久久久久亚洲国产800 | 日韩欧美一区在线 | 国产成人99久久亚洲综合精品 | 国产精品久久久久久久免费大片 | 一区亚洲 | 亚洲性视频| 亚洲福利av| 中文字幕国产 | 亚洲风情在线观看 | 精品国产一区二区三区久久 | av网站在线免费观看 | 国产精品永久免费 | 亚洲成人一区二区 | 一区二区三区不卡视频 | 久久精品国产免费 | 91精品观看| www国产成人免费观看视频,深夜成人网 | 国产小视频精品 | 久久精品国产亚洲一区二区 | 国产精品日产欧美久久久久 | 国产在线观 | 操操操av| 这里只有精品999 | 超碰国产在线 | 亚洲黄色av网站 | 久久久精品一区 | h视频在线免费 | 欧美精品中文字幕久久二区 | 久久久久国产成人精品亚洲午夜 | 亚洲精品乱码8久久久久久日本 | 亚洲欧美自拍偷拍视频 | 欧美日韩在线视频一区 |