[文档下载] NUC123SD4ANO的I2C从地址在那个地方看

[复制链接]
2853|18
 楼主| wxfyyzy520 发表于 2017-8-15 15:05 | 显示全部楼层 |阅读模式
如题NUC123SD4ANO的I2C从地址在那个地方看,找了好久官方网也逛了,希望大佬教教我
 楼主| wxfyyzy520 发表于 2017-8-15 15:45 | 显示全部楼层
好吧懂了。。
yiyigirl2014 发表于 2017-8-15 15:56 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 16 $
  5. * $Date: 16/06/21 7:43p $
  6. * @brief
  7. *           Demonstrate how to receive Master data in GC (General Call) mode.
  8. *           Needs to work with I2C_GCMode_Master sample code.
  9. * @note
  10. * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "NUC123.h"

  15. #define PLLCON_SETTING      CLK_PLLCON_72MHz_HXT
  16. #define PLL_CLOCK           72000000

  17. volatile uint32_t slave_buff_addr;
  18. volatile uint8_t g_au8SlvData[256];
  19. volatile uint8_t g_au8SlvRxData[3];
  20. /*---------------------------------------------------------------------------------------------------------*/
  21. /* Global variables                                                                                        */
  22. /*---------------------------------------------------------------------------------------------------------*/
  23. volatile uint8_t g_u8DeviceAddr;
  24. volatile uint8_t g_au8SlvTxData[3];
  25. volatile uint8_t g_u8SlvDataLen;
  26. volatile uint8_t g_u8SlvEndFlag = 0;

  27. typedef void (*I2C_FUNC)(uint32_t u32Status);

  28. static I2C_FUNC s_I2C0HandlerFn = NULL;

  29. /*---------------------------------------------------------------------------------------------------------*/
  30. /*  I2C0 IRQ Handler                                                                                       */
  31. /*---------------------------------------------------------------------------------------------------------*/
  32. void I2C0_IRQHandler(void)
  33. {
  34.     uint32_t u32Status;

  35.     u32Status = I2C_GET_STATUS(I2C0);

  36.     if(I2C_GET_TIMEOUT_FLAG(I2C0))
  37.     {
  38.         /* Clear I2C0 Timeout Flag */
  39.         I2C_ClearTimeoutFlag(I2C0);
  40.     }
  41.     else
  42.     {
  43.         if(s_I2C0HandlerFn != NULL)
  44.             s_I2C0HandlerFn(u32Status);
  45.     }
  46. }

  47. /*---------------------------------------------------------------------------------------------------------*/
  48. /*  I2C GC mode Rx Callback Function                                                                       */
  49. /*---------------------------------------------------------------------------------------------------------*/
  50. void I2C_GCSlaveRx(uint32_t u32Status)
  51. {
  52.     if(u32Status == 0x70)                      /* Reception of the general call address and one more data byte;
  53.                                                                         ACK has been return */
  54.     {
  55.         g_u8SlvDataLen = 0;
  56.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  57.     }
  58.     else if(u32Status == 0x90)                 /* Previously addressed with General Call; Data has been received
  59.                                                    ACK has been returned */
  60.     {
  61.         g_au8SlvRxData[g_u8SlvDataLen] = (unsigned char) I2C_GET_DATA(I2C0);
  62.         g_u8SlvDataLen++;

  63.         if(g_u8SlvDataLen == 2)
  64.         {
  65.             slave_buff_addr = (g_au8SlvRxData[0] << 8) + g_au8SlvRxData[1];
  66.         }
  67.         if(g_u8SlvDataLen == 3)
  68.         {
  69.             g_au8SlvData[slave_buff_addr] = g_au8SlvRxData[2];
  70.             g_u8SlvDataLen = 0;
  71.         }
  72.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  73.     }
  74.     else if(u32Status == 0x98)                 /* Previously addressed with General Call; Data byte has been
  75.                                                    received; NOT ACK has been returned */
  76.     {
  77.         g_u8SlvDataLen = 0;
  78.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  79.     }
  80.     else if(u32Status == 0xA0)                 /* A STOP or repeated START has been received while still addressed
  81.                                                    as SLV receiver */
  82.     {
  83.         g_u8SlvDataLen = 0;
  84.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  85.         if(slave_buff_addr == 0xFF)
  86.         {
  87.             g_u8SlvEndFlag = 1;
  88.         }
  89.     }
  90.     else
  91.     {
  92.         /* TO DO */
  93.         printf("Status 0x%x is NOT processed\n", u32Status);
  94.     }
  95. }

  96. void SYS_Init(void)
  97. {
  98.     /*---------------------------------------------------------------------------------------------------------*/
  99.     /* Init System Clock                                                                                       */
  100.     /*---------------------------------------------------------------------------------------------------------*/

  101.     /* Enable XT1_OUT (PF0) and XT1_IN (PF1) */
  102.     SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN;

  103.     /* Enable Internal RC 22.1184MHz clock */
  104.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  105.     /* Waiting for Internal RC clock ready */
  106.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  107.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  108.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  109.     /* Enable external XTAL 12MHz clock */
  110.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  111.     /* Waiting for external XTAL clock ready */
  112.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  113.     /* Set core clock as PLL_CLOCK from PLL */
  114.     CLK_SetCoreClock(PLL_CLOCK);

  115.     /* Enable UART module clock */
  116.     CLK_EnableModuleClock(UART0_MODULE);

  117.     /* Enable I2C0 module clock */
  118.     CLK_EnableModuleClock(I2C0_MODULE);

  119.     /* Select UART module clock source */
  120.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  121.     /*---------------------------------------------------------------------------------------------------------*/
  122.     /* Init I/O Multi-function                                                                                 */
  123.     /*---------------------------------------------------------------------------------------------------------*/

  124.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  125.     SYS->GPB_MFP = SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

  126.     /* Set GPF multi-function pins for I2C0 SDA and SCL */
  127.     SYS->GPF_MFP |= (SYS_GPF_MFP_PF2_I2C0_SDA | SYS_GPF_MFP_PF3_I2C0_SCL);
  128.     SYS->ALT_MFP1 &= ~(SYS_ALT_MFP1_PF2_Msk | SYS_ALT_MFP1_PF3_Msk);
  129.     SYS->ALT_MFP1 |= (SYS_ALT_MFP1_PF2_I2C0_SDA | SYS_ALT_MFP1_PF3_I2C0_SCL);
  130. }

  131. void UART0_Init()
  132. {
  133.     /*---------------------------------------------------------------------------------------------------------*/
  134.     /* Init UART                                                                                               */
  135.     /*---------------------------------------------------------------------------------------------------------*/
  136.     /* Reset IP */
  137.     SYS_ResetModule(UART0_RST);

  138.     /* Configure UART0 and set UART0 Baudrate */
  139.     UART_Open(UART0, 115200);
  140. }

  141. void I2C0_Init(void)
  142. {
  143.     /* Open I2C module and set bus clock */
  144.     I2C_Open(I2C0, 100000);

  145.     /* Get I2C0 Bus Clock */
  146.     printf("I2C clock %d Hz\n", I2C_GetBusClockFreq(I2C0));

  147.     /* Set I2C 4 Slave Addresses and Enable GC Mode */
  148.     I2C_SetSlaveAddr(I2C0, 0, 0x15, 1);   /* Slave Address : 0x15 */
  149.     I2C_SetSlaveAddr(I2C0, 1, 0x35, 1);   /* Slave Address : 0x35 */
  150.     I2C_SetSlaveAddr(I2C0, 2, 0x55, 1);   /* Slave Address : 0x55 */
  151.     I2C_SetSlaveAddr(I2C0, 3, 0x75, 1);   /* Slave Address : 0x75 */

  152.     /* Set I2C 4 Slave Addresses Mask */
  153.     I2C_SetSlaveAddrMask(I2C0, 0, 0x01);
  154.     I2C_SetSlaveAddrMask(I2C0, 1, 0x04);
  155.     I2C_SetSlaveAddrMask(I2C0, 2, 0x01);
  156.     I2C_SetSlaveAddrMask(I2C0, 3, 0x04);

  157.     /* Enable I2C interrupt */
  158.     I2C_EnableInt(I2C0);
  159.     NVIC_EnableIRQ(I2C0_IRQn);
  160. }

  161. void I2C0_Close(void)
  162. {
  163.     /* Disable I2C0 interrupt and clear corresponding NVIC bit */
  164.     I2C_DisableInt(I2C0);
  165.     NVIC_DisableIRQ(I2C0_IRQn);

  166.     /* Disable I2C0 and close I2C0 clock */
  167.     I2C_Close(I2C0);
  168.     CLK_DisableModuleClock(I2C0_MODULE);

  169. }

  170. /*---------------------------------------------------------------------------------------------------------*/
  171. /*  Main Function                                                                                          */
  172. /*---------------------------------------------------------------------------------------------------------*/
  173. int32_t main(void)
  174. {
  175.     uint32_t i;

  176.     /* Unlock protected registers */
  177.     SYS_UnlockReg();

  178.     /* Init System, IP clock and multi-function I/O */
  179.     SYS_Init();

  180.     /* Init UART0 for printf */
  181.     UART0_Init();

  182.     /* Lock protected registers */
  183.     SYS_LockReg();

  184.     /*
  185.         This sample code sets I2C bus clock to 100kHz. Then, accesses Slave (GC Mode) with Byte Write
  186.         and Byte Read operations, and check if the read data is equal to the programmed data.
  187.     */

  188.     printf("\n");
  189.     printf("+----------------------------------------------------------+\n");
  190.     printf("| I2C Driver Sample Code (Slave) for access Slave (GC Mode)|\n");
  191.     printf("| Needs to work with I2C_GCMode_Master sample code         |\n");
  192.     printf("| I2C Master (I2C0) <---> I2C Slave(I2C0)(Address: 0x00)   |\n");
  193.     printf("| !! This sample code requires two borads to test !!       |\n");
  194.     printf("+----------------------------------------------------------+\n");

  195.     printf("Configure I2C0 as a slave.\n");
  196.     printf("The I/O connection for I2C0:\n");
  197.     printf("I2C0_SDA(PF.2), I2C0_SCL(PF.3)\n");

  198.     /* Init I2C0 */
  199.     I2C0_Init();

  200.     /* I2C enter no address SLV mode */
  201.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);

  202.     /* Clear receive buffer */
  203.     for(i = 0; i < 0x100; i++)
  204.     {
  205.         g_au8SlvData[i] = 0;
  206.     }

  207.     g_u8SlvEndFlag = 0;

  208.     /* I2C function to Slave receive data */
  209.     s_I2C0HandlerFn = I2C_GCSlaveRx;

  210.     printf("\n");
  211.     printf("Slave(GC Mode) waiting for receiving data.\n");
  212.     while(g_u8SlvEndFlag == 0);

  213.     /* Check receive data correct or not */
  214.     for(i = 0; i < 0x100; i++)
  215.     {
  216.         g_au8SlvTxData[0] = (uint8_t)((i & 0xFF00) >> 8);
  217.         g_au8SlvTxData[1] = (uint8_t)(i & 0x00FF);
  218.         g_au8SlvTxData[2] = (uint8_t)(g_au8SlvTxData[1] + 3);
  219.         if(g_au8SlvData[i] != g_au8SlvTxData[2])
  220.         {
  221.             printf("GC Mode Receive data fail.\n");
  222.             while(1);
  223.         }
  224.     }

  225.     printf("GC Mode receive data OK.\n");

  226.     s_I2C0HandlerFn = NULL;

  227.     /* Close I2C0 */
  228.     I2C0_Close();

  229.     return 0;
  230. }


yiyigirl2014 发表于 2017-8-15 15:58 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V3.00
  4. * $Revision: 4 $
  5. * $Date: 16/06/21 7:36p $
  6. * @brief
  7. *           Show how to set I2C use Multi bytes API Read and Write data to Slave.
  8. *           Needs to work with I2C_Slave sample code.
  9. * @note
  10. * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "NUC123.h"

  15. #define PLLCTL_SETTING  CLK_PLLCTL_72MHz_HXT
  16. #define PLL_CLOCK       72000000
  17. /*---------------------------------------------------------------------------------------------------------*/
  18. /* Global variables                                                                                        */
  19. /*---------------------------------------------------------------------------------------------------------*/
  20. volatile uint8_t g_u8DeviceAddr;

  21. /*---------------------------------------------------------------------------------------------------------*/
  22. /* System initial                                                                                          */
  23. /*---------------------------------------------------------------------------------------------------------*/
  24. void SYS_Init(void)
  25. {
  26.     /*---------------------------------------------------------------------------------------------------------*/
  27.     /* Init System Clock                                                                                       */
  28.     /*---------------------------------------------------------------------------------------------------------*/

  29.     /* Enable XT1_OUT (PF0) and XT1_IN (PF1) */
  30.     SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN;

  31.     /* Enable Internal RC 22.1184MHz clock */
  32.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  33.     /* Waiting for Internal RC clock ready */
  34.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  35.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  36.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  37.     /* Enable external XTAL 12MHz clock */
  38.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  39.     /* Waiting for external XTAL clock ready */
  40.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  41.     /* Set core clock as PLL_CLOCK from PLL */
  42.     CLK_SetCoreClock(PLL_CLOCK);

  43.     /* Enable UART module clock */
  44.     CLK_EnableModuleClock(UART0_MODULE);

  45.     /* Enable I2C0, I2C1 module clock */
  46.     CLK_EnableModuleClock(I2C0_MODULE);   

  47.     /* Select UART module clock source */
  48.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  49.     /*---------------------------------------------------------------------------------------------------------*/
  50.     /* Init I/O Multi-function                                                                                 */
  51.     /*---------------------------------------------------------------------------------------------------------*/

  52.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  53.     SYS->GPB_MFP = SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

  54.     /* Set GPF multi-function pins for I2C0 SDA and SCL */
  55.     SYS->GPF_MFP |= (SYS_GPF_MFP_PF2_I2C0_SDA | SYS_GPF_MFP_PF3_I2C0_SCL);
  56.     SYS->ALT_MFP1 &= ~(SYS_ALT_MFP1_PF2_Msk | SYS_ALT_MFP1_PF3_Msk);
  57.     SYS->ALT_MFP1 |= (SYS_ALT_MFP1_PF2_I2C0_SDA | SYS_ALT_MFP1_PF3_I2C0_SCL);
  58. }

  59. void UART0_Init()
  60. {
  61.     /*---------------------------------------------------------------------------------------------------------*/
  62.     /* Init UART                                                                                               */
  63.     /*---------------------------------------------------------------------------------------------------------*/
  64.     /* Reset IP */
  65.     SYS_ResetModule(UART0_RST);

  66.     /* Configure UART0 and set UART0 Baudrate */
  67.     UART_Open(UART0, 115200);
  68. }


  69. void I2C0_Init(void)
  70. {
  71.     /* Open I2C0 module and set bus clock */
  72.     I2C_Open(I2C0, 100000);

  73.     /* Get I2C0 Bus Clock */
  74.     printf("I2C0 clock %d Hz\n", I2C_GetBusClockFreq(I2C0));

  75.     /* Set I2C0 4 Slave Addresses */
  76.     I2C_SetSlaveAddr(I2C0, 0, 0x15, 0);   /* Slave Address : 0x15 */
  77.     I2C_SetSlaveAddr(I2C0, 1, 0x35, 0);   /* Slave Address : 0x35 */
  78.     I2C_SetSlaveAddr(I2C0, 2, 0x55, 0);   /* Slave Address : 0x55 */
  79.     I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */

  80.     /* Set I2C0 4 Slave Addresses Mask */
  81.     I2C_SetSlaveAddrMask(I2C0, 0, 0x01);
  82.     I2C_SetSlaveAddrMask(I2C0, 1, 0x04);
  83.     I2C_SetSlaveAddrMask(I2C0, 2, 0x01);
  84.     I2C_SetSlaveAddrMask(I2C0, 3, 0x04);
  85. }

  86. void I2C0_Close(void)
  87. {
  88.     /* Disable I2C0 interrupt and clear corresponding NVIC bit */
  89.     I2C_DisableInt(I2C0);
  90.     NVIC_DisableIRQ(I2C0_IRQn);

  91.     /* Disable I2C0 and close I2C0 clock */
  92.     I2C_Close(I2C0);
  93.     CLK_DisableModuleClock(I2C0_MODULE);
  94. }

  95. /*---------------------------------------------------------------------------------------------------------*/
  96. /*  Main Function                                                                                          */
  97. /*---------------------------------------------------------------------------------------------------------*/
  98. int32_t main(void)
  99. {
  100.     uint32_t i;
  101.     uint8_t txbuf[256] = {0}, rDataBuf[256] = {0};  

  102.     /* Unlock protected registers */
  103.     SYS_UnlockReg();

  104.     /* Init System, IP clock and multi-function I/O */
  105.     SYS_Init();

  106.     /* Init UART0 for printf */
  107.     UART0_Init();

  108.     /* Lock protected registers */
  109.     SYS_LockReg();

  110.     /*
  111.         This sample code sets I2C bus clock to 100kHz. Then, Master accesses Slave with Byte Write
  112.         and Byte Read operations, and check if the read data is equal to the programmed data.
  113.     */
  114.     printf("+--------------------------------------------------------+\n");
  115.     printf("| I2C Driver Sample Code for Multi Bytes Read/Write Test |\n");
  116.     printf("| Needs to work with I2C_Slave sample code               |\n");
  117.     printf("|                                                        |\n");   
  118.     printf("|      I2C Master (I2C0) <---> I2C Slave (I2C0)          |\n");
  119.     printf("| !! This sample code requires two borads to test !!     |\n");
  120.     printf("+--------------------------------------------------------+\n");

  121.     printf("\n");
  122.     printf("Configure I2C0 as Master\n");
  123.     printf("The I/O connection to I2C0\n");
  124.     printf("I2C0_SDA(PF.2), I2C0_SCL(PF.3)\n\n");

  125.     /* Init I2C0 */
  126.     I2C0_Init();

  127.     /* Slave address */
  128.     g_u8DeviceAddr = 0x15;
  129.    
  130.     /* Prepare data for transmission */
  131.     for(i = 0; i<256; i++)
  132.     {
  133.         txbuf[i] = (uint8_t) i+3;
  134.     }     

  135.     for(i=0; i<256; i+=32)
  136.     {
  137.         /* Write 32 bytes data to Slave */
  138.         while(I2C_WriteMultiBytesTwoRegs(I2C0, g_u8DeviceAddr, i, &txbuf[i], 32) < 32);   
  139.     }      
  140.    
  141.     printf("Multi bytes Write access Pass.....\n");
  142.    
  143.     printf("\n");
  144.       
  145.     /* Use Multi Bytes Read from Slave (Two Registers) */   
  146.     while(I2C_ReadMultiBytesTwoRegs(I2C0, g_u8DeviceAddr, 0x0000, rDataBuf, 256) < 256);

  147.     /* Compare TX data and RX data */
  148.     for(i = 0; i<256; i++)
  149.     {
  150.         if(txbuf[i] != rDataBuf[i])
  151.             printf("Data compare fail... R[%d] Data: 0x%X\n", i, rDataBuf[i]);
  152.     }
  153.     printf("Multi bytes Read access Pass.....\n");
  154.         
  155.     while(1);
  156. }


yiyigirl2014 发表于 2017-8-15 15:58 | 显示全部楼层
参考官方BSP的几个例程序。
 楼主| wxfyyzy520 发表于 2017-8-15 18:20 | 显示全部楼层
yiyigirl2014 发表于 2017-8-15 15:58
参考官方BSP的几个例程序。

代码我也看过啊,就是    I2C_SetSlaveAddr(I2C0, 0, 0x15, 0);   /* Slave Address : 0x15 */
    I2C_SetSlaveAddr(I2C0, 1, 0x35, 0);   /* Slave Address : 0x35 */
    I2C_SetSlaveAddr(I2C0, 2, 0x55, 0);   /* Slave Address : 0x55 */
    I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */

    /* Set I2C0 4 Slave Addresses Mask */
    I2C_SetSlaveAddrMask(I2C0, 0, 0x01);
    I2C_SetSlaveAddrMask(I2C0, 1, 0x04);
    I2C_SetSlaveAddrMask(I2C0, 2, 0x01);
    I2C_SetSlaveAddrMask(I2C0, 3, 0x04);
上面第三个选项地址,不知道从哪里来的

评论

你在芯片开发手册《XX Technical Reference Manual》内搜索“I2C Address Register”,可以看到“The content of this register is irrelevant when I2C is in Master mode.”意思就是你上述设置的地址,在单片机处于主机模式下是没有意义的。当单片机处于从机模式下,这个地址才起作用。至于单片机在主机模式下,他的从机外设地址,得看外设设备的datasheet,一般通过上下拉电阻配置外设设备的从机地址。  发表于 2019-3-29 16:10
yiyigirl2014 发表于 2017-8-15 19:03 | 显示全部楼层
你可以看两个模式的例程序,那个是在从机里设置的。。然后主机里通过那个地址访问。

评分

参与人数 1威望 +1 收起 理由
wxfyyzy520 + 1 赞一个!

查看全部评分

yiyigirl2014 发表于 2017-8-15 19:03 | 显示全部楼层
如果从机是什么I2C的芯片,那么地址是固化好的,在芯片上有。
玛尼玛尼哄 发表于 2017-8-15 19:53 | 显示全部楼层
  I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */
看备注0x75是从机地址,前面的3,和后面的0是什么东西啊
 楼主| wxfyyzy520 发表于 2017-8-16 09:00 | 显示全部楼层
玛尼玛尼哄 发表于 2017-8-15 19:53
I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */
看备注0x75是从机地址,前面的3,和 ...

I2C通道
734774645 发表于 2017-8-20 21:08 | 显示全部楼层
直接用库函数搞就行了。
734774645 发表于 2017-8-20 21:24 | 显示全部楼层

  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]      Set 7-bit Slave Address and GC Mode
  3. *
  4. * @param[in]  i2c          I2C port
  5. * @param[in]  u8SlaveNo    Set the number of I2C address register (0~3)
  6. * @param[in]  u8SlaveAddr  7-bit slave address
  7. * @param[in]  u8GCMode     Enable/Disable GC Mode (I2C_GCMODE_ENABLE / I2C_GCMODE_DISABLE)
  8. *
  9. * [url=home.php?mod=space&uid=266161]@return[/url]     None
  10. *
  11. * [url=home.php?mod=space&uid=1543424]@Details[/url]    This function is used to set 7-bit slave addresses in I2C SLAVE ADDRESS REGISTER (I2CADDR0~3)
  12. *             and enable GC Mode.
  13. *
  14. */
  15. void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode)
  16. {
  17.     switch(u8SlaveNo)
  18.     {
  19.         case 1:
  20.             i2c->I2CADDR1  = (u8SlaveAddr << 1) | u8GCMode;
  21.             break;
  22.         case 2:
  23.             i2c->I2CADDR2  = (u8SlaveAddr << 1) | u8GCMode;
  24.             break;
  25.         case 3:
  26.             i2c->I2CADDR3  = (u8SlaveAddr << 1) | u8GCMode;
  27.             break;
  28.         case 0:
  29.         default:
  30.             i2c->I2CADDR0  = (u8SlaveAddr << 1) | u8GCMode;
  31.             break;
  32.     }
  33. }
734774645 发表于 2017-8-20 21:29 | 显示全部楼层
  1. /**
  2. * @brief      Configure the mask bits of 7-bit Slave Address
  3. *
  4. * @param[in]  i2c              I2C port
  5. * @param[in]  u8SlaveNo        Set the number of I2C address mask register (0~3)
  6. * @param[in]  u8SlaveAddrMask  A byte for slave address mask
  7. *
  8. * @return     None
  9. *
  10. * @details    This function is used to set 7-bit slave addresses.
  11. *
  12. */
  13. void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask)
  14. {
  15.     switch(u8SlaveNo)
  16.     {
  17.         case 1:
  18.             i2c->I2CADM1  = u8SlaveAddrMask << 1;
  19.             break;
  20.         case 2:
  21.             i2c->I2CADM2  = u8SlaveAddrMask << 1;
  22.             break;
  23.         case 3:
  24.             i2c->I2CADM3  = u8SlaveAddrMask << 1;
  25.             break;
  26.         case 0:
  27.         default:
  28.             i2c->I2CADM0  = u8SlaveAddrMask << 1;
  29.             break;
  30.     }
  31. }
734774645 发表于 2017-8-20 21:30 | 显示全部楼层
看上面头文件的说明
734774645 发表于 2017-8-20 21:33 | 显示全部楼层
然后配合那个函数原型里面用到的寄存器,去看手册里面关于那几个平行寄存器的介绍。
玛尼玛尼哄 发表于 2017-8-20 21:40 | 显示全部楼层

手册上说可以设置0到3,也就是说可以有4个通道,这4个通道是不是针对单片机上不同的管脚的那种通道啊。
梦想的天空 发表于 2018-1-4 20:55 | 显示全部楼层
现在有个问题,从机可以设置4个地址,如果我设置了如下4个地址: 0x10,0x20,0xA0,0x90; 在iic中断响应的时候如何判断是哪个地址匹配了响应中断
xuxuemin123123 发表于 2019-3-29 16:10 | 显示全部楼层
在芯片开发手册《XX Technical Reference Manual》内搜索“I2C Address Register”,可以看到“The content of this register is irrelevant when I2C is in Master mode.”意思就是上述设置的地址,在单片机处于主机模式下是没有意义的。当单片机处于从机模式下,这个地址才起作用。至于单片机在主机模式下,他的从机外设地址,得看外设设备的datasheet,一般通过上下拉电阻配置外设设备的从机地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部