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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6432|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)大佬賜教一下關(guān)于MCP3421芯片的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:214223 發(fā)表于 2019-12-12 17:21 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
簡單描述一下我遇到的問題:了解到MCP3421是一塊精度很高的AD,而且利用I2C通信。所以想用32做一個(gè)簡單表頭。

搭建AD部分電路,我用的是官方應(yīng)用電路:
(這里VDD用的是5V電源,stm32用的是3.3V,電源是分開的)
然后接入到stm32f103c8的PB6,PB7。也就是I2C1接口。但是程序是模擬I2C(因?yàn)榫W(wǎng)上例程基本上都用模擬I2C),也就是我并沒有用到硬件I2C。
燒寫程序過后,無論仿真查看變量值還是實(shí)際顯示,都為0。讀不到電壓值。想問問大佬問題出在哪呢,是I2C接口嗎,還是另有原因?
附上我的程序:

"mcp.h"

  1. #ifndef __MCP_H
  2. #define __MCP_H

  3. #include "sys.h"

  4. #define IIC_SCL_PORT              GPIOB
  5. #define IIC_SCL_CLK               RCC_APB2Periph_GPIOB  
  6. #define IIC_SCL_PIN               GPIO_Pin_6

  7. #define IIC_SDA_PORT              GPIOB
  8. #define IIC_SDA_CLK               RCC_APB2Periph_GPIOB  
  9. #define IIC_SDA_PIN               GPIO_Pin_7

  10. #define MCP3421_12AD 0x80       
  11. #define MCP3421_14AD 0x84
  12. #define MCP3421_16AD 0x88
  13. #define MCP3421_18AD 0x8c
  14.                     
  15. //IO方向設(shè)置
  16. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<8;}
  17. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<8;}


  18. //IO操作函數(shù)         
  19. #define Set_IIC_SCL  {GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN);}
  20. #define Clr_IIC_SCL  {GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN);}
  21. #define Set_IIC_SDA  {GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN);}
  22. #define Clr_IIC_SDA  {GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN);}
  23. #define READ_SDA    (GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN))



  24. //IIC所有操作函數(shù)
  25. void IIC_Init(void);                //初始化IIC的IO口                                 
  26. void IIC_Start(void);                                //發(fā)送IIC開始信號(hào)
  27. void IIC_Stop(void);                                  //發(fā)送IIC停止信號(hào)
  28. void IIC_Send_Byte(u8 txd);                        //IIC發(fā)送一個(gè)字節(jié)
  29. u8 IIC_Read_Byte(void);//IIC讀取一個(gè)字節(jié)
  30. u8 IIC_Wait_Ack(void);                                 //IIC等待ACK信號(hào)
  31. void IIC_Ack(void);                                        //IIC發(fā)送ACK信號(hào)
  32. void IIC_NAck(void);                                //IIC不發(fā)送ACK信號(hào)
  33. float READ_MCP3421(void);
  34. void WRITE_MCP3421(unsigned char wr_data);
  35. u32 Read_Mcp3421_Data(void);
  36. void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
  37. u8 IIC_Read_One_Byte(u8 daddr,u8 addr);       
  38. u32 Get_Adc(void);

  39. extern unsigned long int elech;
  40. extern unsigned long int elecl;
  41. extern unsigned long int elecm;
  42. extern unsigned long int mcp_busy;  

  43. void IIC_Delay(void);
  44. void IIC_Start_Test(void);


  45. #endif

復(fù)制代碼
"mcp.c"
  1. #include "mcp.h"


  2. void IIC_Delay(void)
  3. {
  4.         unsigned int i;
  5.         for(i=0;i<75;i++)
  6.         {
  7.                
  8.         }
  9. }


  10. void IIC_Init(void)
  11.         {                                             
  12.         GPIO_InitTypeDef GPIO_InitStructure;
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);                                                 

  14.         GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽輸出
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);

  18.         GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
  19.         GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);

  20.         Set_IIC_SCL;
  21.         Set_IIC_SDA;
  22.         }

  23. //產(chǎn)生IIC起始信號(hào)
  24. void IIC_Start(void)
  25. {
  26.         SDA_OUT();     //sda線輸出
  27.         Set_IIC_SDA;                    
  28.         Set_IIC_SCL;
  29.         IIC_Delay();
  30.         Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
  31.         IIC_Delay();
  32.         Clr_IIC_SCL;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  33. }         

  34. //產(chǎn)生IIC停止信號(hào)
  35. void IIC_Stop(void)
  36. {
  37.         SDA_OUT();//sda線輸出
  38.         Clr_IIC_SCL;
  39.         Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
  40.         IIC_Delay();
  41.         Set_IIC_SCL;
  42.         IIC_Delay();
  43.         Set_IIC_SDA;//發(fā)送I2C總線結(jié)束信號(hào)
  44.         IIC_Delay();                                                                  
  45. }

  46. //等待應(yīng)答信號(hào)到來
  47. //返回值:1,接收應(yīng)答失敗
  48. //        0,接收應(yīng)答成功
  49. u8 IIC_Wait_Ack(void)
  50. {
  51.   unsigned char i=2;
  52.   SDA_IN();      //SDA設(shè)置為輸入
  53.         Set_IIC_SDA;
  54.         IIC_Delay();
  55.         Set_IIC_SCL;
  56.         IIC_Delay();

  57.   while(i--)
  58.                  {
  59.                         if(READ_SDA==1)
  60.                                         {
  61.                                         Clr_IIC_SCL;
  62.                                         IIC_Delay();
  63.                                          Set_IIC_SCL;
  64.                                         IIC_Delay();
  65.                                         }
  66.                         else
  67.                                 goto loop;
  68.                         }
  69. loop:
  70.   Clr_IIC_SCL;
  71.   IIC_Delay();
  72.   return 0;
  73. }

  74. //產(chǎn)生ACK應(yīng)答
  75. void IIC_Ack(void)
  76. {
  77.         Clr_IIC_SCL;
  78.         SDA_OUT();
  79.         Clr_IIC_SDA;
  80.         IIC_Delay();
  81.         Set_IIC_SCL;
  82.         IIC_Delay();
  83.         Clr_IIC_SCL;
  84. }

  85. //不產(chǎn)生ACK應(yīng)答                    
  86. void IIC_NAck(void)
  87. {
  88.         Clr_IIC_SCL;
  89.         SDA_OUT();
  90.         Set_IIC_SDA;
  91.         IIC_Delay();
  92.         Set_IIC_SCL;
  93.         IIC_Delay();
  94.         Clr_IIC_SCL;
  95. }       

  96. //IIC發(fā)送一個(gè)字節(jié)
  97. //返回從機(jī)有無應(yīng)答
  98. //1,有應(yīng)答
  99. //0,無應(yīng)答                          
  100. void IIC_Send_Byte(u8 txd)
  101. {                        
  102.     u8 t;   
  103.         SDA_OUT();             
  104.     for(t=0;t<8;t++)
  105.     {              
  106.                 Clr_IIC_SCL;
  107.                 IIC_Delay();
  108.                 if (txd&0x80)         Set_IIC_SDA
  109.                 else Clr_IIC_SDA;
  110.         txd<<=1;           
  111.                 IIC_Delay();
  112.                 Set_IIC_SCL;
  113.                 IIC_Delay();
  114.        

  115.     }
  116.         Clr_IIC_SCL;         
  117. }

  118. //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   
  119. u8 IIC_Read_Byte(void)
  120. {
  121.         unsigned char i,receive=0;
  122.         SDA_IN();//SDA設(shè)置為輸入
  123.     for(i=0;i<8;i++ )
  124.         {
  125.     receive<<=1;
  126.                 Clr_IIC_SCL;
  127.                 IIC_Delay();
  128.                 Set_IIC_SCL;
  129.                 IIC_Delay();
  130.         if(READ_SDA)
  131.                 {
  132.                         receive |= 0x01;
  133.         }
  134.                 else
  135.                 {
  136.                         receive &= 0xfe;
  137.                 }
  138.     }

  139.         Clr_IIC_SCL;                                          
  140.     return receive;
  141. }

  142. /*******************************************************************
  143. wr_data:MCP3421_12AD 采用12位AD       
  144. wr_data:MCP3421_14AD 采用14位AD
  145. wr_data:MCP3421_16AD 采用16位AD
  146. wr_data:MCP3421_18AD 采用18位AD
  147. ********************************************************************/
  148. void WRITE_MCP3421(unsigned char wr_data)
  149. {
  150.         IIC_Start();
  151.         IIC_Send_Byte(0xd0);//寫
  152.         IIC_Wait_Ack();
  153.         IIC_Send_Byte(wr_data);
  154.         IIC_Wait_Ack();
  155.         IIC_Stop();
  156. }


  157. float READ_MCP3421(void)
  158. {
  159.         unsigned long int elech;
  160.         unsigned long int elecm;
  161.         unsigned long int elecl;
  162.         unsigned long int AD_B_Result;
  163.         float AD_F_Result=0.0;
  164.         IIC_Start();
  165.         IIC_Send_Byte(0xd1);//讀
  166.         IIC_Wait_Ack();
  167.         elech=(long int)IIC_Read_Byte();
  168.         IIC_Ack();
  169.         elecm=(long int)IIC_Read_Byte();
  170.         IIC_Ack();
  171.         elecl=(long int)IIC_Read_Byte();
  172.         IIC_NAck();
  173.         IIC_Stop();
  174.         AD_B_Result=(elech<<16)|(elecm<<8)|(elecl);
  175.         AD_B_Result=AD_B_Result&0x01ffffff;
  176.         AD_F_Result=(float)((float)(2.048/131072)*((float)AD_B_Result));
  177.         return AD_F_Result;
  178. }
復(fù)制代碼


最后在我的main函數(shù)里面
  1. int main(void)
  2. {
  3. float Vrm = 0.0;
  4. char DisBuf[200];
  5. IIC_Init();
  6. while(1)
  7. {
  8.          WRITE_MCP3421(MCP3421_18AD);
  9.             Vrm=READ_MCP3421();
  10.                    IIC_Delay();
  11.         printf(" | V:%4.2f | \r\n",Vrm);
  12.          sprintf(DisBuf,"% 4.2f",Vrm);
  13. LCD_ShowString(110,270, (u8*)DisBuf,DARKBLUE);
  14. }
  15. }
復(fù)制代碼
這里用了printf函數(shù),網(wǎng)上有資料說不用在I2C通信時(shí)使用這個(gè)函數(shù),所以我注釋了過后再運(yùn)行查找變量,或者就是更改另一種顯示方法,始終都是讀不到電壓值的。求大佬不吝賜教,感激不盡!



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

使用道具 舉報(bào)

沙發(fā)
ID:214223 發(fā)表于 2019-12-12 17:25 | 只看該作者
突然想起來這個(gè)初始化程序好像也是在51論壇里面看到的,他們也確實(shí)能用啊!
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 2019-12-13 08:19 | 只看該作者
這個(gè)IC的IIC地址并不是固定的,是根據(jù)IC上絲印來決定的
每一批出廠的IC的IIC地址都是不一樣的,所以,你用別人的代碼就不一定行,要看你手頭上IC的絲印來決定的
回復(fù)

使用道具 舉報(bào)

地板
ID:214223 發(fā)表于 2019-12-13 10:40 | 只看該作者
Y_G_G 發(fā)表于 2019-12-13 08:19
這個(gè)IC的IIC地址并不是固定的,是根據(jù)IC上絲印來決定的
每一批出廠的IC的IIC地址都是不一樣的,所以,你用 ...

噢噢噢噢,十分謝謝,我以為器件出廠默認(rèn)都是000
回復(fù)

使用道具 舉報(bào)

5#
ID:214223 發(fā)表于 2019-12-13 10:45 | 只看該作者
Y_G_G 發(fā)表于 2019-12-13 08:19
這個(gè)IC的IIC地址并不是固定的,是根據(jù)IC上絲印來決定的
每一批出廠的IC的IIC地址都是不一樣的,所以,你用 ...

我看了下我這個(gè)是默認(rèn)絲印是000,那么問題應(yīng)該不在這對(duì)吧?
回復(fù)

使用道具 舉報(bào)

6#
ID:401564 發(fā)表于 2019-12-13 11:57 | 只看該作者
Host 發(fā)表于 2019-12-13 10:45
我看了下我這個(gè)是默認(rèn)絲印是000,那么問題應(yīng)該不在這對(duì)吧?

那就不知道了,我是用匯編的,C語言是真心看不明白
回復(fù)

使用道具 舉報(bào)

7#
ID:662832 發(fā)表于 2019-12-13 12:37 | 只看該作者
每一批出廠的IC的IIC地址都是不一樣,用別人的代碼就不一定行,要看你的IC的絲印
回復(fù)

使用道具 舉報(bào)

8#
ID:214223 發(fā)表于 2019-12-13 15:46 | 只看該作者
Y_G_G 發(fā)表于 2019-12-13 11:57
那就不知道了,我是用匯編的,C語言是真心看不明白

噢噢噢噢,麻煩了,非常感謝
回復(fù)

使用道具 舉報(bào)

9#
ID:214223 發(fā)表于 2019-12-13 15:49 | 只看該作者
還有大佬賜教嗎?小弟感激不盡
回復(fù)

使用道具 舉報(bào)

10#
ID:401564 發(fā)表于 2019-12-14 11:06 | 只看該作者
Host 發(fā)表于 2019-12-13 15:46
噢噢噢噢,麻煩了,非常感謝

其實(shí)這IC沒有那么難操作的,就數(shù)據(jù)處理不太好處理,用C的話就不存在這個(gè)問題的
你可以先寫一個(gè)專門驗(yàn)證的函數(shù),功能也不要太多就,就寫入和讀取功能驗(yàn)證而已,只要能正常寫入和讀取,器件就會(huì)有應(yīng)答信號(hào),其它的再慢慢的修改
回復(fù)

使用道具 舉報(bào)

11#
ID:214223 發(fā)表于 2019-12-16 12:17 | 只看該作者
Y_G_G 發(fā)表于 2019-12-14 11:06
其實(shí)這IC沒有那么難操作的,就數(shù)據(jù)處理不太好處理,用C的話就不存在這個(gè)問題的
你可以先寫一個(gè)專門驗(yàn)證的 ...

好,那我先單獨(dú)做試試,實(shí)在是非常感謝
回復(fù)

使用道具 舉報(bào)

12#
ID:684378 發(fā)表于 2020-1-9 21:50 | 只看該作者
代碼就懶得看了,實(shí)話說MCP3421我正好做過,你首先確定你的I2C通了沒有,上電有默認(rèn)設(shè)置,你先讀一個(gè)字節(jié)看對(duì)不對(duì),讀寫地址別搞錯(cuò)了,D0  D1,
回復(fù)

使用道具 舉報(bào)

13#
ID:822748 發(fā)表于 2020-9-24 11:33 | 只看該作者
MCP3421不兼容3.3V呀,要把MCP3421電源換成3.3V
回復(fù)

使用道具 舉報(bào)

14#
ID:149642 發(fā)表于 2021-4-20 11:51 | 只看該作者
哎,只會(huì)匯編,咋辦?
板凳,瓜子,啤酒。
回復(fù)

使用道具 舉報(bào)

15#
ID:417546 發(fā)表于 2022-4-1 21:09 | 只看該作者
微兔程序 發(fā)表于 2020-9-24 11:33
MCP3421不兼容3.3V呀,要把MCP3421電源換成3.3V

mcp3421.png (44.98 KB, 下載次數(shù): 92)

mcp3421.png
回復(fù)

使用道具 舉報(bào)

16#
ID:417546 發(fā)表于 2022-4-1 21:10 | 只看該作者
微兔程序 發(fā)表于 2020-9-24 11:33
MCP3421不兼容3.3V呀,要把MCP3421電源換成3.3V

支持的,官方手冊(cè)是2.7-5.5V!
回復(fù)

使用道具 舉報(bào)

17#
ID:703081 發(fā)表于 2022-4-12 11:36 | 只看該作者
高手在民間
回復(fù)

使用道具 舉報(bào)

18#
ID:149642 發(fā)表于 2024-1-13 21:03 | 只看該作者
我是只讀了第一個(gè)字節(jié),后面就讀不出了。。不知道什么原因,配置16位,18位,14位都是這樣。。應(yīng)答程序應(yīng)該沒問題,
回復(fù)

使用道具 舉報(bào)

19#
ID:401564 發(fā)表于 2024-1-15 12:44 | 只看該作者
lksbbs 發(fā)表于 2024-1-13 21:03
我是只讀了第一個(gè)字節(jié),后面就讀不出了。。不知道什么原因,配置16位,18位,14位都是這樣。。應(yīng)答程序應(yīng)該 ...

每讀取完一個(gè)字節(jié)的數(shù)據(jù),就要應(yīng)答一次
讀取完所有的數(shù)據(jù),就要發(fā)送一個(gè)不應(yīng)答信號(hào)和一個(gè)停止信號(hào),不然數(shù)據(jù)容易亂
要嚴(yán)格按照時(shí)序圖上的來操作
回復(fù)

使用道具 舉報(bào)

20#
ID:149642 發(fā)表于 2024-1-16 07:57 | 只看該作者
Y_G_G 發(fā)表于 2024-1-15 12:44
每讀取完一個(gè)字節(jié)的數(shù)據(jù),就要應(yīng)答一次
讀取完所有的數(shù)據(jù),就要發(fā)送一個(gè)不應(yīng)答信號(hào)和一個(gè)停止信號(hào),不然數(shù) ...

謝謝,不是應(yīng)答的問題,已經(jīng)解決了,是接收數(shù)據(jù)前需要先拉低數(shù)據(jù)位,或者說先清0
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 另类在线 | 久久高清国产视频 | 国产精品视频久久久久久 | 国产网站在线播放 | 一区二区三区影院 | 日日人人| 一区二区三区四区国产精品 | 高清国产一区二区 | 99久久久久| 国产欧美精品 | 美女在线视频一区二区三区 | 五月综合激情婷婷 | 99精品网| 日韩av一二三区 | 午夜精品三区 | 国产精品夜夜夜一区二区三区尤 | 国内精品久久精品 | 在线91 | 亚洲午夜精品久久久久久app | 91国产视频在线 | 国产精品久久久久久久久久久久 | 中文字幕国 | 日韩在线免费视频 | 6996成人影院网在线播放 | 国产精品一区在线观看你懂的 | 国产伦精品一区二区三区精品视频 | 国产91av视频在线观看 | 91久色| 网站黄色在线 | 精品国产一区二区三区久久久久久 | 国产精品久久久久久久久久久久午夜片 | 午夜免费福利片 | 久久久久久国产免费视网址 | 欧美精品在线播放 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 美女爽到呻吟久久久久 | 午夜欧美 | 男人的天堂在线视频 | 亚洲a视频 | 四虎最新 | 韩日一区二区三区 |