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

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

QQ登錄

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

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

請(qǐng)教大神們 :STM32模擬IIC通訊

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:461428 發(fā)表于 2020-11-16 16:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我寫(xiě)的H和C文件都復(fù)制在下面 請(qǐng)教下  程序不能正常通訊  是不是哪兒錯(cuò)了?謝謝

#ifndef __iic_H
#define __iic_H

#include "sys.h"
#include "delay.h"
//IO方向設(shè)置
#define SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}//此處應(yīng)該=0XFFFFFF0F這才是管腳9
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}//此處應(yīng)該=0XFFFFFF0F
//IO操作函數(shù)         
#define IIC_SCL    PBout(8) //SCL
#define IIC_SDA    PBout(9) //SDA         
#define READ_SDA   PBin(9)
//extern IIC_Init();
//IIC所有操作函數(shù)
                         
void IIC_Start(void);                                //發(fā)送IIC開(kāi)始信號(hào)
void IIC_Stop(void);                                  //發(fā)送IIC停止信號(hào)
void IIC_Send_Byte(u8 txd);                        //IIC發(fā)送一個(gè)字節(jié)
u8 IIC_Wait_Ack(void);                                 //IIC等待ACK信號(hào)
void IIC_Ack(void);                                        //IIC發(fā)送ACK信號(hào)
void IIC_NAck(void);                                //IIC不發(fā)送ACK信號(hào)
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);         
void IIC_Init(void);
u8 IIC_Read_Byte(void);               //IIC讀取一個(gè)字節(jié)
#endif
以上為我的H文件下面是C 文件
#include "iic.h"

//初始化IIC  |RCC_APB2Periph_AFIO   GPIO_Mode_Out_PP  GPIO_Mode_AF_OD GPIO_Mode_AF_OD
void IIC_Init(void)//|RCC_APB2Periph_AFIO,
{                       
        GPIO_InitTypeDef  GPIO_InitStructure;          
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP; //推挽輸出  GPIO_Mode_Out_OD
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
        IIC_SCL=1;
        IIC_SDA=1;
}
//產(chǎn)生IIC起始信號(hào)
void IIC_Start(void)
{
        SDA_OUT();  
        IIC_SDA=1;       
    delay_us(5);   
        IIC_SCL=1;
        delay_us(5);
        IIC_SDA=0;
        delay_us(5);
        IIC_SCL=0;
}          
//產(chǎn)生IIC停止信號(hào)
void IIC_Stop(void)
{
    SDA_OUT();  
        IIC_SDA=0;
        delay_us(5);
        IIC_SCL=1;
    delay_us(5);
        IIC_SDA=1;
        delay_us(5);                                                                  
}
//等待應(yīng)答信號(hào)到來(lái)
//返回值:1,接收應(yīng)答失敗
//       0,接收應(yīng)答成功
u8 IIC_Wait_Ack(void)
{
        u8 ASK=0;  
   SDA_IN();
        IIC_SCL=1;
        while(READ_SDA)
        {
                ASK++;delay_us(100);
                if(ASK>250)
                {
                        IIC_Stop();
            
                        return 1;
                }
        }
        IIC_SCL=0;//時(shí)鐘輸出0           
        return 0;  
}
//產(chǎn)生ACK應(yīng)答
void IIC_Ack(void)
{
        u8 i;
  
  IIC_SCL=0;                  
        while (IIC_SDA==1&&i<250)i++;
   delay_us(5);               
IIC_SCL=0;                  
   delay_us(5);            
}

void IIC_Send_Byte(u8 txd)
{                        
    u8 t;  
    SDA_OUT()  
    IIC_SCL=0;
    for(t=0;t<8;t++)
    {              
       if(txd&0x80)IIC_SDA=1;
        else IIC_SDA=0;
                 
                delay_us(5);   
                IIC_SCL=1;
                delay_us(5);
                IIC_SCL=0;                       
         txd<<=1;
                delay_us(5);
    }         
}

//讀1個(gè)字節(jié)   
u8 IIC_Read_Byte()
{
        unsigned char i,receive=0;
   SDA_IN();
     IIC_SDA=1;
    delay_us(3);
    for(i=0;i<8;i++ )
        {
        IIC_SCL=1;
        delay_us(5);               
        receive<<=1;
       receive|=READ_SDA;
        delay_us(5);      
        IIC_SCL=0;
         delay_us(5);
    }                                         
   
    return receive;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:461428 發(fā)表于 2020-11-16 16:33 | 只看該作者
使用時(shí)檢查應(yīng)答信號(hào)。然后通過(guò)串口打印出來(lái)錯(cuò)誤結(jié)果都是開(kāi)始信號(hào)失敗
回復(fù)

使用道具 舉報(bào)

板凳
ID:461428 發(fā)表于 2020-11-16 16:33 | 只看該作者
串口打印的錯(cuò)誤如下開(kāi)始信號(hào)發(fā)送失敗! 器件地址82發(fā)送成功! 寄存器地址20發(fā)送成功! 開(kāi)始信號(hào)發(fā)送失敗! 讀命令83發(fā)送成功! 讀數(shù)據(jù)失敗!
回復(fù)

使用道具 舉報(bào)

地板
ID:568565 發(fā)表于 2020-11-16 16:34 | 只看該作者
大致看了一下好像沒(méi)什么問(wèn)題,最好用邏輯分析儀查一查
回復(fù)

使用道具 舉報(bào)

5#
ID:461428 發(fā)表于 2020-11-16 16:41 | 只看該作者
chenyinhu 發(fā)表于 2020-11-16 16:34
大致看了一下好像沒(méi)什么問(wèn)題,最好用邏輯分析儀查一查

邏輯分析儀這東西還真沒(méi)有。我在考慮是不是我硬件接法問(wèn)題?AL53L1激光測(cè)距芯片。XSHUT.GPIO_1. SDA.SCL都接了4.7K上拉電阻電源3.3.
回復(fù)

使用道具 舉報(bào)

6#
ID:827243 發(fā)表于 2020-11-16 16:41 | 只看該作者
  1. #include "i2c2.h"
  2. #define I2C2_EN
  3. #define I2C2_DIS

  4. void LL_IWDG_ReloadCounter(IWDG_TypeDef *IWDGx);
  5. void I2C_delay(void)
  6. {
  7.         u8 t = 50;
  8.         while(t--);
  9.         LL_IWDG_ReloadCounter(IWDG);
  10.         return;
  11. }
  12. int I2C_Start(void)
  13. {
  14.         I2C_SDA_OUT();
  15.        
  16.         SCL_L;
  17.         SDA_H;
  18.         SCL_H;
  19.         I2C_delay();
  20.         if(!SDAO_read)
  21.         {
  22.                 return DISABLE;
  23.         }
  24.         SDA_L;
  25.         I2C_delay();
  26.         if(SDAO_read)
  27.         {
  28.                 return DISABLE;
  29.         }
  30.         SCL_L;
  31.         SDA_H;
  32.         return ENABLE;
  33. }
  34. void I2C_Stop(void)
  35. {
  36.         I2C_SDA_OUT();       
  37.         SCL_L;
  38.         SDA_L;       
  39.         SCL_H;
  40.         I2C_delay();
  41.         SDA_H;
  42.         I2C_delay();
  43.         SCL_L;
  44. }

  45. void I2C_Ack()
  46. {
  47.         SCL_L;
  48.         I2C_SDA_OUT();
  49.        
  50.         SDA_L;
  51.         I2C_delay();
  52.         SCL_H;
  53.         I2C_delay();
  54.         SCL_L;
  55.         SDA_H;
  56. }

  57. void I2C_NoAck()
  58. {
  59.        
  60.         SCL_L;
  61.         I2C_SDA_OUT();
  62.        
  63.         I2C_delay();
  64.         SDA_H;
  65.         I2C_delay();
  66.         SCL_H;
  67.         I2C_delay();
  68.         SCL_L;
  69. }
  70. uint8_t I2C_GetAck(void)
  71. {
  72.   uint8_t time = 0;
  73.         I2C_SDA_IN();
  74.         SDA_H;
  75.         I2C_delay();
  76.         SCL_H;
  77.         I2C_delay();
  78.         while(SDA_read)
  79.         {
  80.                 time++;
  81.                 if(time > 250)
  82.                 {                       
  83.                         SCL_L;
  84.                         return DISABLE;
  85.                 }
  86.         }
  87.         SCL_L;
  88.         return ENABLE;
  89. }
  90. void I2C_SendByte(uint8_t Data)
  91. {
  92.   uint8_t cnt;
  93.   I2C_SDA_OUT();       
  94.   for(cnt=0; cnt<8; cnt++)
  95.   {
  96.     SCL_L;                              
  97.     I2C_delay();

  98.     if(Data & 0x80)
  99. //    if(Data & 0x01)
  100.     {
  101.       SDA_H;                        
  102.     }
  103.     else
  104.     {
  105.       SDA_L;                        
  106.     }
  107.     Data <<= 1;
  108. //    Data >>= 1;
  109.     SCL_H;                              
  110.     I2C_delay();
  111.   }
  112.   SCL_L;                                   
  113.   I2C_delay();
  114. }


  115. uint8_t I2C_ReadByte(uint8_t ack)
  116. {
  117.   uint8_t cnt;
  118.   uint16_t data;
  119.   I2C_SDA_IN();       
  120.        
  121.   for(cnt=0; cnt<8; cnt++)
  122.   {
  123.     SCL_L;                                
  124.     I2C_delay();
  125.                
  126.     SCL_H;                             
  127.     data <<= 1;
  128.     if(SDA_read)
  129.     {
  130.       data |= 0x01;                              
  131.     }
  132.     I2C_delay();
  133.   }
  134.   if(ack == 1)
  135.   {
  136.      I2C_NoAck();
  137.   }
  138.   else
  139.   {
  140.      I2C_Ack();
  141.   }
  142.   return data;                                 
  143. }
  144. void I2C_GPIO_Configuration(void)
  145. {
  146.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  147.   /* GPIO Ports Clock Enable */
  148.   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);

  149.   GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
  150.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  151.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  152.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  153.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);


  154. }


  155. void I2C_SDA_IN()
  156. {
  157.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  158.   GPIO_InitStruct.Pin = I2C_Pin_SDA;
  159.   GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  160.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  161. }

  162. void I2C_SDA_OUT()
  163. {
  164.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  165.   GPIO_InitStruct.Pin = I2C_Pin_SDA;
  166.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  167.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  168.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  169.   LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  170. }
  171. void I2C_Initializes(void)
  172. {
  173.         I2C_GPIO_Configuration();
  174.   SCL_H;
  175.         SDA_H;
  176. }
  177. int EEPROM_WriteByte(uint16_t Addr, uint8_t Data)
  178. {
  179.         u16 i;
  180.        
  181.         I2C2_EN;
  182.         I2C_Start();
  183.         I2C_SendByte(EEPROM_DEV_ADDR | EEPROM_WR);
  184.   if(!I2C_GetAck())
  185.   {
  186.         I2C_Stop();
  187.         return DISABLE;
  188.   }
  189.   #if (8 == EEPROM_WORD_ADDR_SIZE)
  190.   I2C_SendByte((uint8_t)(Addr&0x00FF));   
  191.   #else
  192.   I2C_SendByte((uint8_t)(Addr>>8));
  193.   I2C_GetAck();
  194.   I2C_SendByte((uint8_t)(Addr&0x00FF));
  195.   #endif
  196.   I2C_GetAck();
  197.   I2C_SendByte(Data);
  198.   I2C_GetAck();
  199.         I2C_delay();
  200.   I2C_Stop();
  201.         I2C_delay();
  202.         I2C2_DIS;
  203.         for (i=0;i<500;i++) I2C_delay();
  204.         return 1;
  205. }

  206. #define OLED_ADDRESS 0x78

  207. int OLED_WriteByte(uint8_t Addr, uint8_t Data)
  208. {
  209.         u16 i;
  210.        
  211.         I2C2_EN;
  212.         I2C_Start();
  213.         I2C_SendByte(0x78);
  214.   if(!I2C_GetAck())
  215.   {
  216.         I2C_Stop();
  217.         return DISABLE;
  218.   }
  219.   I2C_SendByte(Addr);   
  220.   I2C_GetAck();
  221.   I2C_SendByte(Data);
  222.   I2C_GetAck();
  223.         I2C_delay();
  224.   I2C_Stop();
  225.         I2C_delay();
  226.         return 1;
  227. }

  228. int EEPROM_ReadByte(uint16_t Addr, uint8_t *Data)
  229. {
  230.         u16 i;
  231.        
  232.         I2C2_EN;
  233.   I2C_Start();
  234.         I2C_SendByte(EEPROM_DEV_ADDR | EEPROM_WR);
  235.   if(!I2C_GetAck())
  236.   {
  237.         I2C_Stop();
  238.         return DISABLE;
  239.   }
  240.   #if (8 == EEPROM_WORD_ADDR_SIZE)
  241.   I2C_SendByte((uint8_t)(Addr&0x00FF));
  242.   #else
  243.   I2C_SendByte((uint8_t)(Addr>>8));   
  244.   I2C_GetAck();
  245.         I2C_SendByte((uint8_t)(Addr&0x00FF));
  246.   #endif
  247.   I2C_GetAck();
  248.   I2C_Start();
  249.         I2C_SendByte(EEPROM_DEV_ADDR | EEPROM_RD);
  250.        
  251.         if(!I2C_GetAck())
  252.         {
  253.         I2C_Stop();
  254.         return DISABLE;
  255.   }
  256.   *Data = I2C_ReadByte(0);
  257.   I2C_GetAck();
  258.         I2C_delay();
  259.         I2C_Stop();
  260.         I2C_delay();
  261.         I2C2_DIS;
  262.         for (i=0;i<500;i++) I2C_delay();
  263.         return 1;
  264. }
  265. u8 Who_Am_I(void)
  266. {
  267.         u8 who;
  268.         EEPROM_ReadByte(0x20, &who);
  269.         return who;
  270. }
  271. u8 Sanzhou_Start()
  272. {
  273.         u8 id;
  274.         id = Who_Am_I();
  275.         if(id)
  276.         {
  277.                 EEPROM_WriteByte(0x20, 0xE7);
  278.                 return ENABLE;
  279.         }
  280.         else
  281.                 return DISABLE;
  282. }
復(fù)制代碼

給你段我調(diào)試通過(guò)的代碼吧。
回復(fù)

使用道具 舉報(bào)

7#
ID:461428 發(fā)表于 2020-11-16 17:46 | 只看該作者
daemondong 發(fā)表于 2020-11-16 16:41
給你段我調(diào)試通過(guò)的代碼吧。

謝謝你哈  我來(lái)試試  
回復(fù)

使用道具 舉報(bào)

8#
ID:461428 發(fā)表于 2020-11-16 17:52 | 只看該作者
daemondong 發(fā)表于 2020-11-16 16:41
給你段我調(diào)試通過(guò)的代碼吧。

H文件一并給我吧 不然修改幅度太大了  謝謝哦
回復(fù)

使用道具 舉報(bào)

9#
ID:342954 發(fā)表于 2020-11-16 18:21 | 只看該作者
把延時(shí)調(diào)慢試試
回復(fù)

使用道具 舉報(bào)

10#
ID:461428 發(fā)表于 2020-11-16 19:36 | 只看該作者
hejianmin 發(fā)表于 2020-11-16 18:21
把延時(shí)調(diào)慢試試

調(diào)過(guò)  調(diào)大調(diào)小  都沒(méi)作用  都是開(kāi)始信號(hào)發(fā)出后  從設(shè)備沒(méi)回應(yīng)。謝謝
回復(fù)

使用道具 舉報(bào)

11#
ID:827243 發(fā)表于 2020-11-17 08:41 | 只看該作者

  1. #ifndef __i2c2_H
  2. #define __i2c2_H

  3. #include "main.h"
  4. #include "GloablVar.h"

  5. #define ANO_GPIO_I2C    GPIOB
  6. #define I2C_Pin_SCL     LL_GPIO_PIN_6
  7. #define I2C_Pin_SDA     LL_GPIO_PIN_7
  8. #define ANO_RCC_I2C     LL_RCC_APB2Periph_GPIOB
  9. /*********************************************/

  10. #define SCL_H         LL_GPIO_SetOutputPin(GPIOB, I2C_Pin_SCL)
  11. #define SCL_L         LL_GPIO_ResetOutputPin(GPIOB, I2C_Pin_SCL)
  12. //#define SCL_H         GPIO_SetBits(GPIOB,GPIO_Pin_10)
  13. //#define SCL_L         GPIO_ResetBits(GPIOB,GPIO_Pin_10)
  14. #define SDA_H         LL_GPIO_SetOutputPin(GPIOB, I2C_Pin_SDA)
  15. #define SDA_L         LL_GPIO_ResetOutputPin(GPIOB, I2C_Pin_SDA)
  16. #define SCL_read      LL_GPIO_IsInputPinSet(GPIOB, I2C_Pin_SCL)
  17. #define SDA_read      LL_GPIO_IsInputPinSet(GPIOB, I2C_Pin_SDA)
  18. #define SDAO_read      LL_GPIO_IsOutputPinSet(GPIOB, I2C_Pin_SDA)

  19. #define EEPROM_DEV_ADDR           0xA0           //??(????)
  20. #define EEPROM_WR                 0x00                     //?
  21. #define EEPROM_RD                 0x01                     //?
  22. #define EEPROM_WORD_ADDR_SIZE     16
  23. extern u8 databuff[3];
  24. extern u8 x,y,z;
  25. int I2C_Start(void);
  26. void I2C_Stop(void);
  27. void I2C_Ack(void);
  28. void I2C_NoAck(void);
  29. void I2C_SDA_OUT(void);
  30. void I2C_SDA_IN(void);
  31. uint8_t I2C_GetAck(void);
  32. void I2C_SendByte(uint8_t Data);
  33. uint8_t I2C_ReadByte(uint8_t ack);
  34. void I2C_delay(void);
  35. int EEPROM_ReadByte(uint16_t Addr, uint8_t *Data);
  36. int EEPROM_WriteByte(uint16_t Addr, uint8_t Data);
  37. void I2C_Initializes(void);
  38. u8 Sanzhou_Start(void);
  39. u8 Who_Am_I(void);
  40. int Read_XYZ(void);
  41. #endif /*__ i2c_H */

  42. /**
  43.   * @}
  44.   */

  45. /**
  46.   * @}
  47.   */

  48. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
復(fù)制代碼

I2C.h 如下。
回復(fù)

使用道具 舉報(bào)

12#
ID:461428 發(fā)表于 2020-11-17 13:47 | 只看該作者

灰常感謝 我先來(lái)用用 IIC程序卡了我3個(gè)月了  業(yè)余愛(ài)好者
回復(fù)

使用道具 舉報(bào)

13#
ID:461428 發(fā)表于 2020-11-17 14:36 | 只看該作者

H文件沒(méi)有涵蓋所有使用參數(shù)的定義。編譯出錯(cuò)很多 提示沒(méi)定義的字符串。還是感謝您的熱心  謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜精品 | 日韩理论电影在线观看 | 在线免费观看视频黄 | 九九九视频在线观看 | 成人视屏在线观看 | 色综合成人网 | 免费观看一级特黄欧美大片 | 国产精品久久久久久久久久 | 亚洲男人的天堂网站 | 久在线| 九九热精品免费 | 欧美视频免费在线 | 国产一区二区三区四区 | 久久久精品一区 | 欧美jizzhd精品欧美巨大免费 | 亚洲一区二区电影网 | 亚洲精品乱码 | 在线黄av | 亚洲视频在线看 | 日韩在线中文 | 午夜成人在线视频 | 日本不卡免费新一二三区 | 日韩在线观看一区二区三区 | 亚洲导航深夜福利涩涩屋 | 亚洲精品字幕 | 日日夜夜草| 免费爱爱视频 | 欧美日韩精品在线一区 | 国产成人午夜精品影院游乐网 | 中文字幕av在线 | aaaa一级毛片 | 久久尤物免费一区二区三区 | 久久国产精品-久久精品 | www..com18午夜观看 | www.97国产 | 日韩一级精品视频在线观看 | 国产黄色电影 | 亚洲精品视频一区二区三区 | 日韩一区精品 | 欧美国产精品 | 精品国产乱码久久久久久图片 |