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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6638|回復(fù): 19
收起左側(cè)

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

[復(fù)制鏈接]
ID:214223 發(fā)表于 2019-12-12 17:21 | 顯示全部樓層 |閱讀模式
簡(jiǎn)單描述一下我遇到的問(wèn)題:了解到MCP3421是一塊精度很高的AD,而且利用I2C通信。所以想用32做一個(gè)簡(jiǎn)單表頭。

搭建AD部分電路,我用的是官方應(yīng)用電路:
1.png (這里VDD用的是5V電源,stm32用的是3.3V,電源是分開(kāi)的)
然后接入到stm32f103c8的PB6,PB7。也就是I2C1接口。但是程序是模擬I2C(因?yàn)榫W(wǎng)上例程基本上都用模擬I2C),也就是我并沒(méi)有用到硬件I2C。
燒寫(xiě)程序過(guò)后,無(wú)論仿真查看變量值還是實(shí)際顯示,都為0。讀不到電壓值。想問(wèn)問(wèn)大佬問(wèn)題出在哪呢,是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開(kāi)始信號(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)到來(lái)
  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ī)有無(wú)應(yīng)答
  98. //1,有應(yīng)答
  99. //0,無(wú)應(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);//寫(xiě)
  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)上有資料說(shuō)不用在I2C通信時(shí)使用這個(gè)函數(shù),所以我注釋了過(guò)后再運(yùn)行查找變量,或者就是更改另一種顯示方法,始終都是讀不到電壓值的。求大佬不吝賜教,感激不盡!



回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-12-13 08:19 | 顯示全部樓層
這個(gè)IC的IIC地址并不是固定的,是根據(jù)IC上絲印來(lái)決定的
每一批出廠的IC的IIC地址都是不一樣的,所以,你用別人的代碼就不一定行,要看你手頭上IC的絲印來(lái)決定的 51hei截圖20191213081607.jpg
回復(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上絲印來(lái)決定的
每一批出廠的IC的IIC地址都是不一樣的,所以,你用 ...

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

使用道具 舉報(bào)

ID:214223 發(fā)表于 2019-12-13 10:45 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-12-13 08:19
這個(gè)IC的IIC地址并不是固定的,是根據(jù)IC上絲印來(lái)決定的
每一批出廠的IC的IIC地址都是不一樣的,所以,你用 ...

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

ID:662832 發(fā)表于 2019-12-13 12:37 | 顯示全部樓層
每一批出廠的IC的IIC地址都是不一樣,用別人的代碼就不一定行,要看你的IC的絲印
回復(fù)

使用道具 舉報(bào)

ID:214223 發(fā)表于 2019-12-13 15:46 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-12-13 11:57
那就不知道了,我是用匯編的,C語(yǔ)言是真心看不明白

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

使用道具 舉報(bào)

ID:214223 發(fā)表于 2019-12-13 15:49 | 顯示全部樓層
還有大佬賜教嗎?小弟感激不盡
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-12-14 11:06 | 顯示全部樓層
Host 發(fā)表于 2019-12-13 15:46
噢噢噢噢,麻煩了,非常感謝

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

使用道具 舉報(bào)

ID:214223 發(fā)表于 2019-12-16 12:17 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-12-14 11:06
其實(shí)這IC沒(méi)有那么難操作的,就數(shù)據(jù)處理不太好處理,用C的話就不存在這個(gè)問(wèn)題的
你可以先寫(xiě)一個(gè)專(zhuān)門(mén)驗(yàn)證的 ...

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:822748 發(fā)表于 2020-9-24 11:33 | 顯示全部樓層
MCP3421不兼容3.3V呀,要把MCP3421電源換成3.3V
回復(fù)

使用道具 舉報(bào)

ID:149642 發(fā)表于 2021-4-20 11:51 | 顯示全部樓層
哎,只會(huì)匯編,咋辦?
板凳,瓜子,啤酒。
回復(fù)

使用道具 舉報(bào)

ID:417546 發(fā)表于 2022-4-1 21:09 | 顯示全部樓層
微兔程序 發(fā)表于 2020-9-24 11:33
MCP3421不兼容3.3V呀,要把MCP3421電源換成3.3V
mcp3421.png
回復(fù)

使用道具 舉報(bào)

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)

ID:703081 發(fā)表于 2022-4-12 11:36 | 顯示全部樓層
高手在民間
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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í)序圖上的來(lái)操作
回復(fù)

使用道具 舉報(bào)

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)答的問(wèn)題,已經(jīng)解決了,是接收數(shù)據(jù)前需要先拉低數(shù)據(jù)位,或者說(shuō)先清0
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 狠狠色综合欧美激情 | 成人av网站在线观看 | 色婷婷一区二区三区四区 | 一区二区三区高清 | 毛色毛片免费看 | 精品久久国产 | 日韩欧美亚洲 | 欧美精品一区二区三区在线 | 成人3d动漫一区二区三区91 | 91porn国产成人福利 | 久久久久国产精品一区二区 | 国产专区在线 | 国产精品天堂 | 一区二区三区播放 | 黑人巨大精品欧美一区二区一视频 | 日韩美女爱爱 | 91精品国产美女在线观看 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 日韩中文字幕一区二区 | 玖玖色在线视频 | 99爱国产 | 国产电影一区二区在线观看 | 免费在线性爱视频 | 欧美亚洲成人网 | 福利视频三区 | 国产高清无av久久 | 美国黄色毛片 | 欧美理伦片在线播放 | 日韩视频在线免费观看 | 成人综合在线视频 | 免费国产一区二区视频 | 亚洲成人精品国产 | 国产综合网址 | 在线观看亚洲一区二区 | 中文字幕av一区二区三区 | 欧美成人二区 | 超碰在线97国产 | 高清一区二区视频 | 亚洲一区二区三区观看 | 日韩精品一区二区在线观看 | 人人爽人人草 |