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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)+Proteus仿真I2C設(shè)備, 設(shè)備無(wú)響應(yīng), 如何寫代碼?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
如圖, 用自帶的I2C debugger看, 發(fā)送完數(shù)據(jù)后的狀態(tài)都是N(nack), 設(shè)備無(wú)響應(yīng)
I2C的啟動(dòng), 發(fā)送, 停止都是正常的, 就是設(shè)備不響應(yīng), 是我代碼的問題還是軟件的問題?



設(shè)備是INA219, 電壓電流監(jiān)測(cè)模塊

文檔給的寫數(shù)據(jù)時(shí)序圖


文檔的典型接法:



我知道一上來就貼代碼讓人很沒有讀的欲望, 但我真的排查不出問題,懇請(qǐng)各位幫忙!
51模擬I2C總線的部分
  1. void IIC_ack(){
  2.         uchar i;
  3.         SCLK = 0;                //時(shí)鐘線置低
  4.         SDA = 1;                //拉高SDA
  5.         delay_us();                //延時(shí), 等待SDA被從機(jī)拉低
  6.         SCLK = 1;                //拉高時(shí)鐘線
  7.         while((SDA == 1) && (i < 255)){
  8.                 i++;                //延時(shí), 繼續(xù)等待
  9.         }
  10.         SCLK = 0;                //拉低時(shí)鐘線
  11.         delay_us();
  12. }

  13. void IIC_sentByte(uchar _data){
  14.         uchar i, temp;
  15.         temp = _data;
  16.         for(i = 0; i < 8; i++){
  17.                 temp = temp << 1;        //數(shù)據(jù)向左移, 左移溢出的一位到PSW寄存器的CY中
  18.                 SCLK = 0;                        //時(shí)鐘線拉低
  19.                 delay_us();
  20.                 SDA = CY;                        //SDA發(fā)送CY中的一位數(shù)據(jù)
  21.                 SCLK = 1;                        
  22.                 delay_us();        
  23.         }
  24.         SCLK = 0;
  25.         delay_us();
  26.         SDA = 1;                                //釋放SDA
  27.         delay_us();

  28. }
復(fù)制代碼

Proteus仿真時(shí)讀的代碼
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "IIC_Protocol_for8051.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.         
  7. //當(dāng)Slave address為1001010 (4AH)時(shí), A1和A0地址線直接采樣SDA上的數(shù)據(jù)
  8. //即 SDA上跑的數(shù)據(jù)就是A0, A1獲取的數(shù)據(jù)

  9. void INA219_sent2Reg(uchar regAddress, uint _data){
  10.         uchar data_MSB = _data / 256;  //獲取數(shù)據(jù)高八位
  11.         uchar data_LSB = _data - (data_MSB * 256);                //獲取數(shù)據(jù)低八位
  12.         IIC_init();                                                                  //I2C總線啟動(dòng)
  13.         IIC_start();
  14.         IIC_sentByte(0x94);       //發(fā)送Slave address(前7位), 和R/#W位(確認(rèn)傳輸方向, 第8位)
  15.                      //0x94 = 0x4A(Slave address) * 2 [在0x4A后加一個(gè)R/#W位]
  16.                      //0x94 = 10010100    0x4A = 1001010
  17.         IIC_ack();
  18.         IIC_sentByte(regAddress);                                //發(fā)送寄存器地址
  19.         IIC_ack();                                                     //并等待從機(jī)是否有Ack(響應(yīng))
  20.         IIC_sentByte(data_MSB);                                 //發(fā)送數(shù)據(jù)高8位
  21.         IIC_ack();
  22.         IIC_sentByte(data_LSB);                                 //發(fā)送低8位
  23.         IIC_ack();
  24.         IIC_stop();                                                  //I2C總線停止
  25. }
  26. void INA219_init(){
  27.         INA219_sent2Reg(0x05, 0x1000);                    //0x1000是要發(fā)送的數(shù)據(jù), 無(wú)特殊含義
  28. }

  29. void main(){
  30.         INA219_init();
  31.         while(1);
  32. }
復(fù)制代碼

INA219.pdf (1.31 MB, 下載次數(shù): 6)

我的一些想法:0. 我覺得這個(gè)可能是INA219的問題, 因?yàn)橹鳈C(jī)連續(xù)發(fā)送一個(gè)字節(jié)后, NACK表示從機(jī)沒有收到數(shù)據(jù), 是不是我的地址寫錯(cuò)了
   或者不應(yīng)該這么寫?
1.會(huì)不會(huì)是這個(gè)設(shè)備我的接法不正確, 導(dǎo)致其根本就不工作呢?









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

使用道具 舉報(bào)

沙發(fā)
ID:884307 發(fā)表于 2021-2-18 19:13 | 只看該作者
這個(gè)注釋...我tab按太多了...大家將就看
回復(fù)

使用道具 舉報(bào)

板凳
ID:844772 發(fā)表于 2021-2-20 08:54 | 只看該作者
你寫的地址是100101,A0,A1應(yīng)該接在SDA上啊,怎么圖上是懸空呢?
回復(fù)

使用道具 舉報(bào)

地板
ID:884307 發(fā)表于 2021-2-20 17:50 | 只看該作者
glinfei 發(fā)表于 2021-2-20 08:54
你寫的地址是100101,A0,A1應(yīng)該接在SDA上啊,怎么圖上是懸空呢?

好像確實(shí)應(yīng)該這樣...
不過我把A1,A0和SDA連起來之后這個(gè)IC還是無(wú)響應(yīng)nack的狀態(tài)...
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2021-2-22 11:11 | 只看該作者
你的地址寫錯(cuò)了


線路接錯(cuò)了




我給你來個(gè)程序試試


  1. #include  "reg52.h"
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit K1=P1^0;//設(shè)置三個(gè)獨(dú)立鍵盤
  6. sbit K2=P1^3;
  7. sbit K3=P1^5;
  8. sbit lcdwrite=P2^3;
  9. sbit lcddatecommand=P2^2;
  10. sbit lcde=P2^4;
  11. uchar code secondline[]="00-00-00";
  12. uchar i;
  13. uchar hour,minutes,seconds;
  14. uchar count,num;
  15. uchar cnt;



  16. sbit SCL = P2^0;     //模擬I2C時(shí)鐘控制位
  17. sbit SDA = P2^1;     //模擬I2C數(shù)據(jù)傳送位

  18. #define ACK 0    //應(yīng)答標(biāo)志位
  19. #define NACK 1

  20. void IIC_Start(void);          //啟動(dòng)總線
  21. void IIC_Stop(void);           //結(jié)束總線
  22. void IIC_SendACK(bit ACK_Type); //應(yīng)答子函數(shù)
  23. bit IIC_RecvACK_Error(void);
  24. void IIC_SendOneByte(unsigned char TxValue); //字節(jié)數(shù)據(jù)傳送函數(shù)  
  25. unsigned char IIC_RecvOneByte(void);         //字節(jié)數(shù)據(jù)傳送函數(shù)  

  26. void Delay_us(unsigned int DelayCycle);  //uS延時(shí)函數(shù)

  27. #define INA219_RD_Operation 0x81
  28. #define INA219_WR_Operation 0x80

  29. unsigned short INA219_ReadReg(unsigned char RegBase);
  30. bit INA219_WriteReg(unsigned char RegBase, unsigned int RegValue);
  31. void INA219_Init(void);
  32. unsigned int INA219_GetBusVolt(void);
  33. unsigned int INA219_GetPower(void);
  34. unsigned int INA219_GetCurrent(void);

  35. void write_command(uchar command);
  36. void write_date(uchar date);

  37. void Delay_us(unsigned int DelayCycle)
  38. {
  39.         unsigned char i;

  40.         while(DelayCycle--)
  41.         {
  42.                 i = 2;
  43.                 while (--i);
  44.         }
  45. }

  46. void nop4()
  47. {
  48.         _nop_();     //等待一個(gè)機(jī)器周期
  49.         _nop_();     //等待一個(gè)機(jī)器周期
  50.         _nop_();     //等待一個(gè)機(jī)器周期
  51.         _nop_();     //等待一個(gè)機(jī)器周期
  52. }

  53. //Bus free time between a STOP and START condition: >1.3us
  54. //LOW period of the SCL clock: >1.3us
  55. //HIGH period of the SCL clock: >0.6us
  56. //Set-up time for a repeated START condition: >0.6us
  57. //Hold time (repeated) START condition: >0.6us
  58. //Data set-up time: >0.1us
  59. //Set-up time for STOP condition >0.6us
  60. //Machine Cycle Time = 1.08us @ 11.0592MHz

  61. void IIC_Start(void)
  62. {
  63.         SCL = 1;
  64.         _nop_();
  65.         SDA = 1;
  66.         nop4();
  67.         SDA = 0;
  68.         nop4();
  69.         SCL = 0;
  70.         _nop_();
  71.         _nop_();
  72. }

  73. void IIC_Stop(void)
  74. {
  75.         SDA = 0;
  76.         _nop_();       
  77.         SCL=0;
  78.         nop4();//>4us后SCL跳變
  79.         SCL = 1;
  80.         nop4();
  81.         SDA = 1;
  82.         _nop_();
  83.         _nop_();
  84. }

  85. void IIC_SendACK(bit ACK_Type)
  86. {
  87.         SDA = ACK_Type;
  88.         SCL = 1;
  89.         SCL = 0;
  90.         SDA = 1;                                                        //Release SDA.
  91. }

  92. bit IIC_RecvACK_Error(void)
  93. {
  94.         bit RecvAckError;

  95.         SDA = 1;                                //Write "1" before read.
  96.         SCL = 1;
  97.         RecvAckError = SDA;                //Read SDA.
  98.         SCL = 0;

  99.         return RecvAckError;
  100. }

  101. void IIC_SendOneByte(unsigned char TxValue)
  102. {
  103.         unsigned char i;

  104.         for(i=0; i<8; i++)
  105.         {
  106.                 TxValue <<= 1;                        //Data is transferred with MSB first.
  107.                 SDA = CY;        //If MSB is 1, the Carry Flag (CY) will be set to 1 after left logical shift, and vice versa.
  108.                 _nop_();
  109.                 SCL = 1;
  110.                 nop4();
  111.                 _nop_();   
  112.                 SCL = 0;
  113.         }
  114. }

  115. unsigned char IIC_RecvOneByte(void)
  116. {
  117.         unsigned char RxValue = 0;
  118.         unsigned char i;

  119.         SDA = 1;                                                        //Write "1" before read.
  120.         for(i=0; i<8; i++)
  121.         {
  122.                 _nop_();
  123.                 SCL = 0;
  124.                 nop4();
  125.                 SCL = 1;
  126.                 _nop_();
  127.                 _nop_();
  128.                 RxValue <<= 1;

  129.                 RxValue |= SDA;
  130.                 _nop_();
  131.         }
  132.         SCL = 0;
  133.         _nop_();

  134.         return RxValue;
  135. }


  136. unsigned int INA219_ReadReg(unsigned char RegBase)
  137. {
  138.         unsigned short RegValue = 0;

  139.         IIC_Start();
  140.         IIC_SendOneByte(INA219_WR_Operation);
  141.         if(!IIC_RecvACK_Error())
  142.         {
  143.                 IIC_SendOneByte(RegBase);
  144.                 if(!IIC_RecvACK_Error())
  145.                 {
  146.                         //IIC_Stop();
  147.                         IIC_Start();
  148.                         IIC_SendOneByte(INA219_RD_Operation);
  149.                         if(!IIC_RecvACK_Error())
  150.                         {
  151.                                 RegValue = IIC_RecvOneByte();
  152.                                 IIC_SendACK(ACK);
  153.                                 RegValue = RegValue << 8;
  154.                                 RegValue |= IIC_RecvOneByte();
  155.                                 IIC_SendACK(NACK);
  156.                         }
  157.                 }
  158.         }
  159.         IIC_Stop();

  160.         return RegValue;
  161. }

  162. bit INA219_WriteReg(unsigned char RegBase, unsigned int RegValue)
  163. {
  164.         bit WrRegError = 1;

  165.         IIC_Start();
  166.         IIC_SendOneByte(INA219_WR_Operation);
  167.         if(!IIC_RecvACK_Error())
  168.         {
  169.                 IIC_SendOneByte(RegBase);
  170.                 if(!IIC_RecvACK_Error())
  171.                 {
  172.                         IIC_SendOneByte((RegValue & 0xFF00) >> 8);
  173.                         IIC_RecvACK_Error();
  174.                         IIC_SendOneByte(RegValue & 0x00FF);
  175.                         WrRegError = IIC_RecvACK_Error();
  176.                 }
  177.         }
  178.         IIC_Stop();

  179.         return !WrRegError;
  180. }

  181. void INA219_Init(void)
  182. { //0+
  183.         INA219_WriteReg(0x00, 0x3C1F);//32V FSR, GAIN = 8, 16 samples, Shunt and Bus, Continuous.
  184.         INA219_WriteReg(0x05, 0x1000);//Use INA219 EVM software to calculate a full-scale calibration value (initial calbration), and then compute the corrected full-scale calibration value based on measured current (second calbration).
  185. }

  186. unsigned int INA219_GetBusVolt(void)
  187. {
  188.         unsigned int BusVoltRegVal;
  189.         // Sometimes a sharp load will reset the INA219, which will
  190.         // reset the cal register, meaning CURRENT and POWER will
  191.         // not be available ... avoid this by always setting a cal
  192.         // value even if it's an unfortunate extra step       
  193.         //INA219_WriteReg(0x05, 0x1000);
  194.         BusVoltRegVal = INA219_ReadReg(0x02);
  195.         if(BusVoltRegVal & 0x0001)                                                                //Overflow
  196.         return 0x0FA0;
  197.         else
  198.         return (BusVoltRegVal & 0xFFF8) >> 1;                //((BusVoltRegVal & 0xFFF8) >> 3)*4mV
  199. }

  200. unsigned int INA219_GetPower(void)
  201. {
  202.         unsigned int PowerRegVal;
  203.         //INA219_WriteReg(0x05, 0x1000);
  204.         PowerRegVal = INA219_ReadReg(0x03);
  205.         return (PowerRegVal >> 1)*5;                                                        //2.5mW/bit
  206. }

  207. unsigned int INA219_GetCurrent(void)
  208. {
  209.         unsigned int CurrentRegVal;
  210.         //INA219_WriteReg(0x05, 0x1050);
  211.         CurrentRegVal = INA219_ReadReg(0x04);
  212.         return CurrentRegVal >> 3;                                                                //0.125mA/bit
  213. }


  214. void RefreshData(void)
  215. {
  216.         unsigned int BusVolt, Current, Power;
  217.         unsigned int OffsetCurrent, OffsetPower;
  218.        
  219.         BusVolt = INA219_GetBusVolt();

  220.        
  221.         OffsetCurrent = (BusVolt >> 9) + 2;                        //Gather statistics of the measured current under various voltage conditions when no load is connected to the output port. Use Excel to do curve fitting.
  222.         Current = INA219_GetCurrent();
  223.         if(Current > OffsetCurrent)
  224.         Current -= OffsetCurrent;
  225.         else
  226.         Current = 0;

  227.         write_command(0x80);
  228.         write_date( BusVolt/10000+48);
  229.         write_date( (BusVolt%10000)/1000+48);
  230.         write_date( '.');
  231.         write_date( (BusVolt%1000)/100+48);
  232.         write_date( (BusVolt%100)/10+48);
  233.         write_date( BusVolt%10+48);
  234.         write_date( 'V');
  235.         write_date( ' ');
  236.         write_date( ' ');
  237.        
  238.         write_date(Current/1000+48);
  239.         write_date( '.');
  240.         write_date( (Current%1000)/100+48);
  241.         write_date( (Current%100)/10+48);
  242.         write_date( Current%10+48);
  243.         write_date( 'A');
  244.        
  245.         OffsetPower = ((BusVolt >> 3) * OffsetCurrent)/125 + 6;
  246.         Power = INA219_GetPower();
  247.         if(Power > OffsetPower)
  248.         Power -= OffsetPower;
  249.         else
  250.         Power = 0;
  251.         write_command(0x80+0x49);
  252.         write_date(Power/10000+48);
  253.         write_date((Power%10000)/1000+48);
  254.         write_date( '.');
  255.         write_date((Power%1000)/100+48);
  256.         write_date( (Power%100)/10+48);
  257.         write_date(Power%10+48);
  258.         write_date( 'W');
  259. }


  260. void delay(uint z)
  261. {
  262.         uint x,y;
  263.         for(x=z;x>0;x--)
  264.         {
  265.                 for(y=0;y<=112;y++)
  266.                 {
  267.                 }
  268.         }
  269. }
  270. void write_command(uchar command)
  271. {
  272.         lcddatecommand=0;
  273.         lcdwrite=0;
  274.         P0=command;
  275.         delay(1);
  276.         lcde=1;
  277.         delay(1);
  278.         lcde=0;
  279. }
  280. void write_date(uchar date)
  281. {
  282.         lcddatecommand=1;
  283.         lcdwrite=0;
  284.         P0=date;
  285.         delay(1);
  286.         lcde=1;
  287.         delay(1);
  288.         lcde=0;
  289. }
  290. void LCDinit()
  291. {
  292.         lcde=0;
  293.         write_command(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  294.         write_command(0x0f);//設(shè)置開顯示,不顯示光標(biāo)
  295.         write_command(0x06);// 寫一個(gè)字符后地址指針加1
  296.         write_command(0x0C);
  297.         write_command(0x80);

  298.         write_command(0x80+0x40);
  299.         for(i=0;i<8;i++)
  300.         {
  301.                 write_date(secondline[i]);
  302.                 delay(1);
  303.         }
  304. }
  305. void Time0init()
  306. {
  307.         TMOD=0x01;//開啟定時(shí)器1
  308.         TH0=(65536-50000)/256;
  309.         TL0=(65536-50000)%256;
  310.         EA=1;
  311.         ET0=1;
  312.         TR0=1;
  313. }
  314. void Clockinit()
  315. {
  316.         hour=0;
  317.         minutes=0;
  318.         seconds=0;
  319.         count=0;
  320.         num=0;
  321. }
  322. void display(uchar hour,uchar minutes,uchar seconds)//接收并發(fā)送數(shù)據(jù)到液晶屏幕
  323. {
  324.         uchar hourge,hourshi,minutesshi,minutesge,secondsshi,secondsge;
  325.         hourshi=hour/10;
  326.         hourge=hour%10;
  327.         write_command(0x80+0x40);
  328.         write_date(hourshi+48);
  329.         delay(1);
  330.         write_date(hourge+48);
  331.         delay(1);

  332.         minutesshi=minutes/10;
  333.         minutesge=minutes%10;
  334.         write_command(0x0C);
  335.         write_command(0x80+0x43);
  336.         write_date(minutesshi+48);
  337.         delay(1);
  338.         write_date(minutesge+48);
  339.         delay(1);

  340.         secondsshi=seconds/10;
  341.         secondsge=seconds%10;
  342.         write_command(0x80+0x46);
  343.         write_date(secondsshi+48);
  344.         delay(1);
  345.         write_date(secondsge+48);
  346.         delay(1);
  347. }
  348. void revise()
  349. {
  350.         if(K1==0)
  351.         {
  352.                 delay(5);
  353.                 if(K1==0)
  354.                 {
  355.                         cnt++;//計(jì)數(shù)第幾次按下
  356.                         TR0=0;
  357.                 }
  358.                 while(!K1);
  359.                 delay(5);
  360.                 while(!K1);
  361.         }
  362.         if(cnt==1)//第一次按下,調(diào)整秒鐘,調(diào)整時(shí)秒鐘有光標(biāo)閃爍
  363.         {
  364.                 write_command(0x80+0x46);
  365.                 write_command(0x0f);
  366.                 if(K2==0)
  367.                 {
  368.                         delay(5);
  369.                         if(K2==0)
  370.                         {
  371.                                 seconds++;
  372.                                 if(seconds==60)
  373.                                 {
  374.                                         seconds=0;
  375.                                 }
  376.                         }
  377.                         while(!K2);
  378.                         delay(5);
  379.                         while(!K2);
  380.                 }
  381.                 if(K3==0)
  382.                 {
  383.                         delay(5);
  384.                         if(K3==0)
  385.                         {
  386.                                 seconds--;
  387.                                 if(seconds==-1)//here is a bug
  388.                                 {
  389.                                         seconds=59;
  390.                                 }
  391.                         }
  392.                         while(!K3);
  393.                         delay(5);
  394.                         while(!K3);
  395.                 }
  396.         }

  397.         if(cnt==2)//第二次按下,調(diào)整分鐘,調(diào)整時(shí)秒鐘有光標(biāo)閃爍
  398.         {
  399.                 write_command(0x80+0x43);
  400.                 write_command(0x0f);
  401.                 if(K2==0)
  402.                 {
  403.                         delay(5);
  404.                         if(K2==0)
  405.                         {
  406.                                 minutes++;
  407.                                 if(minutes==60)
  408.                                 {
  409.                                         minutes=0;
  410.                                 }
  411.                         }
  412.                         while(!K2);
  413.                         delay(5);
  414.                         while(!K2);
  415.                 }
  416.                 if(K3==0)
  417.                 {
  418.                         delay(5);
  419.                         if(K3==0)
  420.                         {
  421.                                 minutes--;
  422.                                 if(minutes==-1)//here is a bug
  423.                                 {
  424.                                         minutes=59;
  425.                                 }
  426.                         }
  427.                         while(!K3);
  428.                         delay(5);
  429.                         while(!K3);
  430.                 }
  431.         }
  432.         if(cnt==3)//第三次按下,調(diào)整時(shí)鐘,調(diào)整時(shí)秒鐘有光標(biāo)閃爍
  433.         {
  434.                 write_command(0x80+0x40);
  435.                 write_command(0x0f);
  436.                 if(K2==0)
  437.                 {
  438.                         delay(5);
  439.                         if(K2==0)
  440.                         {
  441.                                 hour++;
  442.                                 if(hour==24)
  443.                                 {
  444.                                         hour=0;
  445.                                 }
  446.                         }
  447.                         while(!K2);
  448.                         delay(5);
  449.                         while(!K2);
  450.                 }
  451.                 if(K3==0)
  452.                 {
  453.                         delay(5);
  454.                         if(K3==0)
  455.                         {
  456.                                 hour--;
  457.                                 if(hour==-1)//here is a bug
  458.                                 {
  459.                                         hour=23;
  460.                                 }
  461.                         }
  462.                         while(!K3);
  463.                         delay(5);
  464.                         while(!K3);
  465.                 }
  466.         }
  467.         if(cnt==4)
  468.         {
  469.                 TR0=1;
  470.                 cnt=0;
  471.         }
  472. }
  473. void main()
  474. {
  475.         INA219_Init();
  476.         LCDinit();
  477.         Time0init();
  478.         Clockinit();
  479.         Delay_us(2000);
  480.         RefreshData();
  481.         while(1)
  482.         {
  483.                 revise();
  484.                 if(count>=19)
  485.                 {
  486.                         display(hour,minutes,seconds);
  487.                         RefreshData();
  488.                 }
  489.         }
  490. }
  491. void Time0() interrupt 1 using 2
  492. {
  493.         TH0=(65536-50000)/256;
  494.         TL0=(65536-50000)%256;
  495.         count++;
  496.         if(count==20)
  497.         {
  498.                 count=0;
  499.                 seconds++;
  500.                 if(seconds==60)
  501.                 {
  502.                         seconds=0;
  503.                         minutes++;
  504.                         if(minutes==60)
  505.                         {
  506.                                 minutes=0;
  507.                                 hour++;
  508.                                 if(hour==24)
  509.                                 {
  510.                                         hour=0;
  511.                                 }
  512.                         }
  513.                 }
  514.         }
  515. }

復(fù)制代碼





回復(fù)

使用道具 舉報(bào)

6#
ID:155507 發(fā)表于 2021-2-22 14:23 | 只看該作者
Kituro 發(fā)表于 2021-2-20 17:50
好像確實(shí)應(yīng)該這樣...
不過我把A1,A0和SDA連起來之后這個(gè)IC還是無(wú)響應(yīng)nack的狀態(tài)...

我已經(jīng)測(cè)試過了

是Proteus仿真軟件的問題, 這個(gè)INA219仿真I2C設(shè)備, 電壓電流監(jiān)測(cè)模塊 , 只能工作的地址是 0x80, 0x82
其他地址將無(wú)法正常工作
回復(fù)

使用道具 舉報(bào)

7#
ID:884307 發(fā)表于 2021-2-26 20:33 | 只看該作者
angmall 發(fā)表于 2021-2-22 14:23
我已經(jīng)測(cè)試過了

是Proteus仿真軟件的問題, 這個(gè)INA219仿真I2C設(shè)備, 電壓電流監(jiān)測(cè)模塊 , 只能工作的地 ...

非常感謝!
我現(xiàn)在是在自學(xué)電子設(shè)計(jì), 對(duì)于布線和PCB設(shè)計(jì)之類的知識(shí)又一竅不通, 而這些又是必要的
能不能請(qǐng)問一下在哪里能學(xué)習(xí)這些知識(shí)呢?
回復(fù)

使用道具 舉報(bào)

8#
ID:155507 發(fā)表于 2021-2-26 23:58 | 只看該作者
Kituro 發(fā)表于 2021-2-26 20:33
非常感謝!
我現(xiàn)在是在自學(xué)電子設(shè)計(jì), 對(duì)于布線和PCB設(shè)計(jì)之類的知識(shí)又一竅不通, 而這些又是必要的
能不能 ...

做PCB板就比較簡(jiǎn)單了。只要懂得使用Protel軟件或 AltiumDesigner軟件就沒問題了。但要想做的板子布局美觀、布線合理還得費(fèi)一番功夫了。
    嫻熟的單片機(jī)C語(yǔ)言編程、會(huì)使用Protel軟件或 AltiumDesigner軟件設(shè)計(jì)PCB板和具備一定的英文閱讀能力,你就是一個(gè)遇強(qiáng)則強(qiáng)的單片機(jī)高手了。

請(qǐng)看這個(gè)類似參考
http://www.zg4o1577.cn/bbs/mcu-pcb-1.html


可以手動(dòng)布線和自動(dòng)布線相結(jié) 和先排大件,再放小件,堅(jiān)持畫幾塊板,就不會(huì)感覺難了
前期布局最重要,剛學(xué)沒必要糾結(jié)怎么走線 多畫一些板子,自然就找到感覺了
最好是買本書來看,結(jié)合書本理論實(shí)際動(dòng)手,多畫幾塊板子
多看看高手的排線,自己多練練就有自己的思路了
好像有一些布線規(guī)則,找找看
回復(fù)

使用道具 舉報(bào)

9#
ID:884307 發(fā)表于 2021-2-27 21:52 | 只看該作者
angmall 發(fā)表于 2021-2-22 11:11
你的地址寫錯(cuò)了

感謝你的建議!
問一下, 這個(gè)

  1. #define INA219_RD_Operation 0x81
  2. #define INA219_WR_Operation 0x80
復(fù)制代碼

是什么東西, 在文檔里沒看到0x80這個(gè)數(shù)字出現(xiàn), 根據(jù)手冊(cè)第一次發(fā)送的應(yīng)該是slave address, 來指定A0和A1采樣的管腳
為什么要發(fā)送這個(gè) INA219_RD_Operation 呢? 有什么意義嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:155507 發(fā)表于 2021-2-27 23:06 | 只看該作者
Kituro 發(fā)表于 2021-2-27 21:52
感謝你的建議!
問一下, 這個(gè)
是什么東西, 在文檔里沒看到0x80這個(gè)數(shù)字出現(xiàn), 根據(jù)手冊(cè)第一次發(fā)送的應(yīng)該 ...


8.5.6寫入和讀取INA219
通過將適當(dāng)?shù)闹祵懭爰拇嫫髦羔榿碓L問INA219上的特定寄存器。有關(guān)寄存器和相應(yīng)地址的完整列表,請(qǐng)參見表2。如圖18所示,寄存器指針的值是R / W位為L(zhǎng)OW的從設(shè)備地址字節(jié)后的第一個(gè)字節(jié)。
對(duì)INA219的每次寫操作都需要為寄存器指針指定一個(gè)值。
寫入寄存器始于主機(jī)發(fā)送的第一個(gè)字節(jié)。該字節(jié)是從機(jī)地址,R / W位為低電平。
然后,INA219確認(rèn)收到有效地址。主機(jī)發(fā)送的下一個(gè)字節(jié)是將要寫入數(shù)據(jù)的寄存器的地址。
該寄存器地址值將寄存器指針更新為所需的寄存器。接下來的兩個(gè)字節(jié)被寫入寄存器指針?biāo)赶虻募拇嫫鳌?INA219確認(rèn)收到每個(gè)數(shù)據(jù)字節(jié)。主機(jī)可以通過產(chǎn)生START或STOP條件來終止數(shù)據(jù)傳輸。
從INA219讀取時(shí),通過寫操作存儲(chǔ)在寄存器指針中的最后一個(gè)值確定在讀操作期間讀取哪個(gè)寄存器。要更改讀取操作的寄存器指針,必須將新值寫入寄存器指針。
該寫操作通過發(fā)出一個(gè)R / W位為L(zhǎng)OW的從機(jī)地址字節(jié),然后是寄存器指針字節(jié)來完成。
不需要其他數(shù)據(jù)。然后,主機(jī)產(chǎn)生一個(gè)START條件,并發(fā)送具有R / W位為高的從機(jī)地址字節(jié),以啟動(dòng)讀取命令。
下一個(gè)字節(jié)由從機(jī)發(fā)送,是寄存器指針指示的寄存器的最高有效字節(jié)。該字節(jié)之后是來自主機(jī)的應(yīng)答。
然后從機(jī)發(fā)送最低有效字節(jié)。主機(jī)確認(rèn)收到數(shù)據(jù)字節(jié)。主機(jī)可以通過生成一個(gè)
接收到任何數(shù)據(jù)字節(jié)或生成START或STOP條件后,不應(yīng)答。如果需要從同一寄存器重復(fù)讀取,則不必連續(xù)發(fā)送寄存器指針字節(jié);否則,無(wú)需執(zhí)行任何操作。 INA219保留寄存器指針值,直到下一次寫操作對(duì)其進(jìn)行更改為止。
圖15和圖16分別顯示了寫和讀操作時(shí)序圖。請(qǐng)注意,寄存器字節(jié)先發(fā)送最高有效字節(jié),然后再發(fā)送最低有效字節(jié)。










第一次發(fā)送 0x80 寄存器 0x02 讀取電壓  發(fā)送 0x81 讀取 INA219 發(fā)送 0x5D 0xAA    ---> 0x5DAA = 23978/2 =11989mV





回復(fù)

使用道具 舉報(bào)

11#
ID:884307 發(fā)表于 2021-2-28 10:32 | 只看該作者
angmall 發(fā)表于 2021-2-27 23:06
8.5.6寫入和讀取INA219
通過將適當(dāng)?shù)闹祵懭爰拇嫫髦羔榿碓L問INA219上的特定寄存器。有關(guān)寄存器和相應(yīng) ...

好的好的
那這個(gè)A0和A1到底是做什么的, 文檔說是指定從設(shè)備地址, 那這個(gè)表格是什么意思?
回復(fù)

使用道具 舉報(bào)

12#
ID:155507 發(fā)表于 2021-2-28 11:11 | 只看該作者
Kituro 發(fā)表于 2021-2-28 10:32
好的好的
那這個(gè)A0和A1到底是做什么的, 文檔說是指定從設(shè)備地址, 那這個(gè)表格是什么意思?

I2C 總線是一雙線串行總線, 它提供一小型網(wǎng)絡(luò)系統(tǒng),為總線上的電路共享公共的總線。
總線上的器件, 每個(gè)器件都有自己的地址  該INA219器件共有16個(gè)地址, 那你最多可以控制16個(gè)器件
回復(fù)

使用道具 舉報(bào)

13#
ID:884307 發(fā)表于 2021-2-28 11:25 | 只看該作者
angmall 發(fā)表于 2021-2-28 11:11
I2C 總線是一雙線串行總線, 它提供一小型網(wǎng)絡(luò)系統(tǒng),為總線上的電路共享公共的總線。
總線上的器件, 每 ...

我不明白的是, 比如當(dāng)slave address為1000000時(shí), A1和A0都對(duì)應(yīng)到GND上(或者是VSS, SDA, SCL或其他管腳上)對(duì)A0和A1的值有什么影響嗎?
也就是說, 表格中不同的slave address的值, 是否對(duì)A0和A1的值有影響?
回復(fù)

使用道具 舉報(bào)

14#
ID:155507 發(fā)表于 2021-2-28 20:27 | 只看該作者
該個(gè)是因果關(guān)系
因?yàn)槟阈枰獮槊總(gè)INA219器件使用不同的地址,因此你需要將A0和A1引腳連接到不同的值。

回復(fù)

使用道具 舉報(bào)

15#
ID:420836 發(fā)表于 2021-2-28 23:53 | 只看該作者
好問題,讀后有幫助。
回復(fù)

使用道具 舉報(bào)

16#
ID:884307 發(fā)表于 2021-3-21 15:26 | 只看該作者
angmall 發(fā)表于 2021-2-28 20:27
該個(gè)是因果關(guān)系
因?yàn)槟阈枰獮槊總(gè)INA219器件使用不同的地址,因此你需要將A0和A1引腳連接到不同的值。

謝謝, 問題完美解決!
抱歉過了這么久才來回復(fù)你.....
回復(fù)

使用道具 舉報(bào)

17#
ID:891529 發(fā)表于 2021-3-21 15:41 | 只看該作者
建議描述問題時(shí)候,帶上使用的環(huán)境和各參數(shù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 视频二区| 91精品久久久久久久久中文字幕 | 三级av网址 | 日本在线黄色 | 欧美一区二区在线播放 | 免费h在线| 久久五月婷 | 国产精品久久久久久久久久不蜜臀 | 国产一区二区三区四区五区加勒比 | 97影院2| 国产精品久久久久久久久久久久午夜片 | 国产精品欧美一区喷水 | 日韩毛片免费看 | 中文字幕在线免费观看 | 亚洲午夜av | 国产视频1区 | 国产毛片毛片 | 一区二区精品视频 | 91在线视频在线观看 | 欧洲亚洲一区二区三区 | 色就是色欧美 | 一区二区日本 | 精品国产区| 亚洲专区在线 | 亚洲综合色丁香婷婷六月图片 | 在线色网| 日韩欧美三区 | 夜夜av| 91午夜在线 | 日韩欧美国产一区二区 | 欧美激情一区二区三区 | 性一交一乱一透一a级 | 亚洲综合在线网 | 欧美激情久久久 | a爱视频 | 日韩一区二区精品 | 天堂va在线 | 成人免费在线电影 | 亚洲视频在线播放 | 亚洲国产精品99久久久久久久久 | 九色视频网 |