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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3151|回復: 2
收起左側

stm32 iic,硬件iic主模式使用查詢模式,從模式使用中斷模式,已驗證能正常收發數據

[復制鏈接]
ID:590667 發表于 2019-7-26 10:27 | 顯示全部樓層 |閱讀模式
  1. int main(void)
  2. {
  3.         u8 i = 0;
  4.         u16 temp = 0;
  5.   RCC_Configuration();         //時鐘配置
  6.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  7.         
  8.   IIC_Configuration1();
  9.         I2C_Configuration2();
  10.         
  11.         gpio_init();

  12. //        TIM2_Int_Init(719,999);  // 配置定時器TIM1每10ms產生中斷,定時器計數頻率為1kHz=72M/72000。
  13.         
  14.         //GPIO_SetBits(GPIOB,GPIO_Pin_0);
  15.          while(1)
  16.         {
  17.                 temp++;
  18.                 I2C_Master_BufferWrite(I2C1, I2C1_Buffer_Tx, 8, 0x20);
  19.    __nop();
  20.                 for(i=0;i<8;i++)
  21.                 {
  22.                         I2C1_Buffer_Tx[i] = 0;
  23.                         
  24.                 }
  25.     I2C_Master_BufferRead( I2C1, I2C1_Buffer_Tx,8, 0x20);
  26.                 for(i=0;i<8;i++)
  27.                 {
  28.                         I2C1_Buffer_Tx[i] = temp+i;
  29.                         
  30.                 }
  31.                
  32.         }
  33.         
  34. }

  35. #include  "i2c1.h"
  36. #include "delay.h"
  37. #include"stm32f10x.h"        

  38. u8 Tx_Idx1 = 0;
  39. u8 Rx_Idx1 = 0;
  40. u8 I2C1_Buffer_Tx[8] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
  41. u8 I2C1_Buffer_Rx[8] = {0};

  42. u8 ReadingFlag = 0;
  43. /*IIC1從機模式*/
  44. void gpio_init()
  45. {
  46.          GPIO_InitTypeDef GPIO_InitStructure;
  47.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  48.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  49.     //配置IO接口
  50.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_5;  //READY1/READY2
  51.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  52.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //
  53.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  54.         
  55.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //Waring
  56.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
  57.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  58. }

  59. //void I2C_Configuration1(void)
  60. //{
  61. //    GPIO_InitTypeDef GPIO_InitStructure;
  62. //        I2C_InitTypeDef  I2C_InitStructure;
  63. //        NVIC_InitTypeDef NVIC_InitStructure;

  64. //    //使能時鐘
  65. //    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  66. //    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  67. //        
  68. //    //配置IO接口
  69. //    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //PB6/PB7
  70. //    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  71. //    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;        //
  72. //    GPIO_Init(GPIOB, &GPIO_InitStructure);
  73. //         
  74. //                I2C_InitStructure.I2C_ClockSpeed=400000;        //I2C數據傳輸速度
  75. //                I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;          //I2C模式設置         ,I2C模式,SMBus主模式,SMBus從模式
  76. //                I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
  77. //                I2C_InitStructure.I2C_OwnAddress1 =0x20;  //設備地址
  78. //                I2C_InitStructure.I2C_Ack =I2C_Ack_Enable;         
  79. //                I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit ;  //尋址模式,7bit或者10bit
  80. //                I2C_Init(I2C1,&I2C_InitStructure);        

  81. //                NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;//事件中斷
  82. //    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  83. //    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  84. //    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  85. //    NVIC_Init(&NVIC_InitStructure);

  86. //    NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;//錯誤中斷
  87. //    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  88. //    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                 
  89. //    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  90. //    NVIC_Init(&NVIC_InitStructure);

  91. //    I2C_ITConfig(I2C1, I2C_IT_BUF | I2C_IT_EVT |I2C_IT_ERR, ENABLE);   

  92. //                I2C_Cmd(I2C1, ENABLE);
  93. //                 
  94. //}

  95. //void I2C1_EV_IRQHandler(void)            //I2C1事件中斷響應函數 ,主要完成對上位機指令的響應
  96. //{
  97. //        switch(I2C_GetLastEvent(I2C1))
  98. //        {
  99. //                case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
  100. //                        {
  101. ////                                 I2C_GenerateSTOP(I2C2, DISABLE);                                 
  102. //                                 I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
  103. //                                 I2C_ClearFlag(I2C1,I2C_FLAG_BTF);
  104. //                                 break;
  105. //                        }
  106. //                case I2C_EVENT_SLAVE_BYTE_TRANSMITTED:
  107. //                                I2C_SendData(I2C1, I2C1_Buffer_Tx[Tx_Idx1++]);        
  108. //                                break;               
  109. //                case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:                                //EV3
  110. //                                I2C_SendData(I2C1, I2C1_Buffer_Tx[Tx_Idx1++]);
  111. //                                        break;
  112. //                case I2C_EVENT_SLAVE_BYTE_RECEIVED:        
  113. //                           I2C_ClearFlag(I2C1,I2C_FLAG_BTF);
  114. //                                 I2C1_Buffer_Rx[Rx_Idx1++] =  I2C_ReceiveData(I2C1);                                          
  115. //                                break;
  116. //                case I2C_EVENT_SLAVE_STOP_DETECTED:
  117. //                           I2C_ClearFlag(I2C1,I2C_FLAG_STOPF);
  118. //                     I2C_GenerateSTOP(I2C1, DISABLE);
  119. //                           Rx_Idx1=0;  
  120. //                                //i2c_event = EVENT_OPCOD_NOTYET_READ;
  121. //                                break;
  122. //                default:

  123. //                                break;   

  124. //        }        
  125. //}
  126. //        

  127. //void I2C1_ER_IRQHandler(void)            //I2C2錯誤事件中斷響應函數
  128. //{
  129. //   if (I2C_GetITStatus(I2C1, I2C_IT_AF))
  130. //         {
  131. //                         I2C_ClearITPendingBit(I2C1, I2C_IT_AF);
  132. //
  133. //                                Tx_Idx1 = 0;
  134. //                  //i2c_event = EVENT_OPCOD_NOTYET_READ;
  135. //                        
  136. //         }
  137. //         
  138. //         if (I2C_GetITStatus(I2C1, I2C_IT_BERR))
  139. //         {
  140. //                         I2C_ClearITPendingBit(I2C1, I2C_IT_BERR);
  141. //         }
  142. //}

  143. /*IIC1主機模式*/

  144. #define DEVICE_ADDRESS 0x20
  145. /*******************************************************************************
  146. * Function Name  : IIC_Configuration
  147. * Description    : 初始化IIC2外設
  148. * Input          : None
  149. * Output         : None
  150. * Return         : None
  151. *******************************************************************************/
  152. void IIC_Configuration1(void)
  153. {
  154.         //先定義結構體
  155.         GPIO_InitTypeDef         GPIO_InitStructure;
  156.   I2C_InitTypeDef    I2C_InitStructure;
  157.         
  158.         //要開了對應的gpio的時鐘還有其他的外設的時鐘,然后你配置寄存器才可以,軟件仿真里面開時鐘先后沒有影響,但是實物里面,要先開時鐘
  159.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);        //使能APB2外設的GPIOB的時鐘,I2C2是PB_10 SCL,PB_11 SDA上面的復用         
  160.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 ,ENABLE);  //開啟時鐘
  161.         
  162.         //要對上面定義的兩個結構體進行定義,首先PB要定義為復用的才行,而且是開漏復用
  163.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;         //選擇PB_6是SCL引腳
  164.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管腳頻率為50MHZ
  165.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;         //輸出模式為復用開漏輸出
  166.         GPIO_Init(GPIOB,&GPIO_InitStructure);                                 //初始化GPIOB寄存器
  167.         
  168.         //配置I2C
  169.         I2C_DeInit(I2C1);//I2C1寄存器復位
  170.         I2C_InitStructure.I2C_ClockSpeed = 400000;          /*I2C的時鐘頻率100kHz ,不是I2C輸入時鐘的頻率*/
  171.   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;        
  172.   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  /*設置CCR寄存器的,占空比  快速模式下0:Tlow/Thigh = 2;1:Tlow/Thigh = 16/9 */
  173.   I2C_InitStructure.I2C_OwnAddress1 = 0x20 ;         /*這句話說的是stm32作為從機的時候它的地址,如果沒有做從機不用理會這個值*/
  174.   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;        /*應答使能 */
  175.   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /* */
  176.         I2C_Init(I2C1,&I2C_InitStructure);
  177.         
  178.         //使能I2C
  179.         I2C_Cmd(I2C1, ENABLE);
  180. }

  181. /*******************************************************************************
  182. 主機發送數據的流程:
  183. 1) 主機在檢測到總線為“空閑狀態”(即 SDA、SCL 線均為高電平)時,發送一個啟動信號“S”,開始一次通信的開始
  184.   2) 主機接著發送一個命令字節。該字節由 7 位的外圍器件地址和 1 位讀寫控制位 R/W組成(此時 R/W=0)
  185.   3) 相對應的從機收到命令字節后向主機回饋應答信號 ACK(ACK=0)
  186.   4) 主機收到從機的應答信號后開始發送第一個字節的數據
  187.   5) 從機收到數據后返回一個應答信號 ACK
  188.   6) 主機收到應答信號后再發送下一個數據字節
  189.   7) 當主機發送最后一個數據字節并收到從機的 ACK 后,通過向從機發送一個停止信號P結束本次通信并釋放總線。從機收到P信號后也退出與主機之間的通信。
  190.   主機發送數據的程序
  191. *******************************************************************************//**/
  192. uint8_t I2C_Master_BufferWrite(I2C_TypeDef * I2Cx, uint8_t* pBuffer, uint32_t NumByteToWrite, uint8_t SlaveAddress)
  193. {
  194.     if(NumByteToWrite==0)
  195.         return 1;
  196.     /* 1.開始,發送一個s,也就是起始信號*/
  197.     I2C_GenerateSTART(I2Cx, ENABLE);
  198.                 ///判斷EV5,看下函數定義可以發現,該事件是SB=1,MSL=1,BUSY=1 意思是起始條件已經發送了,然后是主模式,總線在通訊
  199.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

  200.     /* 2.設備地址·/寫 */
  201.     I2C_Send7bitAddress(I2Cx, SlaveAddress, I2C_Direction_Transmitter);
  202.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  203.     /* 3.連續寫數據 */
  204.     while(NumByteToWrite--)
  205.     {
  206.       I2C_SendData(I2Cx, *pBuffer);
  207.       while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  208.       pBuffer++;
  209.     }

  210.     /* 4.停止 */
  211.     I2C_GenerateSTOP(I2Cx, ENABLE);//產生停止信號P,結束本次通訊釋放總線
  212.     while ((I2Cx->CR1&0x200) == 0x200);//完成當前字節傳輸后釋放 SCL 和 SDA 線
  213.                
  214.     return 0;
  215. }
  216. /*******************************************************************************
  217. IIC主機讀取數據的具體流程:
  218.   1) 主機發送啟動信號后,接著發送命令字節(其中 R/W=1)
  219.   2) 對應的從機收到地址字節后,返回一個應答信號并向主機發送數據
  220.   3) 主機收到數據后向從機反饋一個應答信號
  221.   4) 從機收到應答信號后再向主機發送下一個數據  
  222.   5) 當主機完成接收數據后,向從機發送一個“非應答信號(ACK=1)”,從機收到ACK=1 的非應答信號后便停止發送
  223.   6) 主機發送非應答信號后,再發送一個停止信號,釋放總線結束通信.

  224. *******************************************************************************/
  225. uint8_t I2C_Master_BufferRead(I2C_TypeDef * I2Cx, uint8_t* pBuffer, uint32_t NumByteToRead, uint8_t SlaveAddress)
  226. {
  227.     if(NumByteToRead==0)
  228.         return 1;
  229.     ///等待總線空閑
  230.     while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
  231.                 ///在接受一個字節(匹配地址或數據)之后返回應答
  232.     I2C_AcknowledgeConfig(I2Cx, ENABLE);
  233.                
  234.     /* 1.開始 */
  235.     I2C_GenerateSTART(I2Cx, ENABLE);
  236.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
  237.                
  238.     /* 2.設備地址·/寫 */
  239.     I2C_Send7bitAddress(I2Cx, SlaveAddress, I2C_Direction_Transmitter);
  240.     while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  241.     /* 3.開始*/
  242.     I2C_GenerateSTART(I2Cx, ENABLE);
  243.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
  244.                
  245.     /* 4.設備地址·/讀 */
  246.     I2C_Send7bitAddress(I2Cx, SlaveAddress, I2C_Direction_Receiver);
  247.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

  248.     /* 5.連續寫數據 */
  249.     while (NumByteToRead)
  250.     {
  251.         if(NumByteToRead==1)
  252.         {
  253.             I2C_AcknowledgeConfig(I2Cx, DISABLE);
  254.             I2C_GenerateSTOP(I2Cx, ENABLE);//6.停止,非應答
  255.         }

  256.         while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED));  /* EV7 */
  257.         *pBuffer++ = I2C_ReceiveData(I2Cx);
  258.         NumByteToRead--;
  259.     }

  260.     I2C_AcknowledgeConfig(I2Cx, ENABLE);
  261.     return 0;
  262. }
復制代碼

全部資料51hei下載地址:
stm32 IIC2.7z (190.48 KB, 下載次數: 44)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线播放一区二区三区 | 成人午夜视频在线观看 | 国产成人久久 | 最新中文在线视频 | 久久人爽| 色综合一区二区 | 国产成人精品a视频一区www | 免费黄色成人 | 亚洲综合五月天婷婷 | 国产精品一区二 | 国产日韩一区二区三区 | 国产你懂的在线观看 | 色视频网站在线观看 | 99久久精品国产一区二区三区 | 91在线最新 | www.色.com| 中文字幕黄色大片 | 婷婷在线免费 | 久久99深爱久久99精品 | 亚洲黄色一级毛片 | 精品欧美一区二区三区久久久 | 欧美日本亚洲 | 中文字幕亚洲精品在线观看 | 成人国产a | 在线国产一区二区三区 | 成人欧美一区二区三区黑人孕妇 | av一区二区三区四区 | 精品日韩欧美一区二区 | 亚洲国产欧美日韩 | 一区二区三区网站 | 一级片在线视频 | 成年女人免费v片 | 久久国产精品-久久精品 | 黄色欧美 | 亚洲久久 | 久久久青草| 伊人在线 | 欧美一区二 | 欧美国产日韩在线观看 | 深爱激情综合 | 毛片a|