硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5382|回复: 6
收起左侧

[客户分享] F407硬件IIC读写24C256

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2020-9-12 09:52:10 | 显示全部楼层 |阅读模式
总感觉模拟IIC总线读写24C256有点浪费时间,然后就想弄个硬件IIC来读写24C256,可是呢,直接操作寄存器总是不成功,最终还是弄的库。这个是参考了网友的程序改的,网名忘记叫啥了,真是惭愧。感谢硬汉对开源的无私奉献,本人才学疏浅搞不了原创,就把网友的程序改动了少许来献丑啦。

  1. /**
  2.   *****************************************************************************
  3.   *
  4.   * @文件名: iic.c
  5.   * @版  本: V1.0
  6.   * @日  期: 2020-7-1
  7.   * @作  者: 振德
  8.   * @备  注:
  9.   *****************************************************************************
  10. **/
  11. #include "IIC.h"

  12. /******************************************************************************
  13.   * 硬件IIC初始化
  14. */
  15. void IIC_Init(I2C_TypeDef* IICx, uint08 SlaveAdd)
  16. {
  17.         GPIO_InitTypeDef GPIO_InitStructure;
  18.         I2C_InitTypeDef I2C_InitStructure;
  19.        
  20.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  21.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
  22.        
  23.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  26.         GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  27.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  28.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  29.        
  30.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
  31.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);
  32.         GPIOD->MODER &= ~GPIO_MODER_MODER3;  /*00:输入;01:通用输出;10:复用输出;11:模拟输入*/
  33.         GPIOD->MODER |= GPIO_MODER_MODER3_0;
  34.        
  35.         I2C_InitStructure.I2C_DutyCycle           = I2C_DutyCycle_2;
  36.         I2C_InitStructure.I2C_OwnAddress1         = SlaveAdd;  //从设备地址
  37.         I2C_InitStructure.I2C_Ack                 = I2C_Ack_Enable;
  38.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  39.         I2C_InitStructure.I2C_ClockSpeed          = (100 * 1000);  //SCL最大100KHz
  40.        
  41.        
  42.         I2C_Cmd(IICx, ENABLE);
  43.         I2C_Init(IICx, &I2C_InitStructure);
  44.         I2C_AcknowledgeConfig(IICx, ENABLE);
  45.        
  46.         IICx->CR1 |= 1u << 7;/*禁止时钟延长*/
  47. }

  48. /*******************************************************************************
  49.   * 硬件IIC等待从设备内部操作完成
  50. */
  51. void IICWaiteStandby(I2C_TypeDef* IICx, uint08 SlaveAdd)
  52. {
  53.         u16 tmp = 0;
  54.         TestValues.BootRunTime = 0;
  55.         IICx->SR1 &= 0x0000;/*清除状态寄存器1*/
  56.         tmp = tmp;
  57.         do        {
  58.                 TestValues.BootRunTime ++;
  59.                 I2C_GenerateSTART(IICx, ENABLE);/*产生起始信号*/
  60.                 tmp = IICx->SR1;/*读取SR1寄存器,然后通过写入数据寄存器来清除SB位*/
  61.                 I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Transmitter);/*发送从设备地址*/
  62.                 if (TestValues.BootRunTime > 1680000)
  63.                         break;
  64.         }
  65.         while ((IICx->SR1 & 0x0002) == 0x0000);/*当ADDR = 1时,表明应答了,退出循环*/
  66.         I2C_ClearFlag(IICx, I2C_FLAG_AF);  /*清除应答失败标志位*/
  67.         I2C_GenerateSTOP(IICx, ENABLE);  /*发送停止信号*/
  68. }

  69. /*******************************************************************************
  70.   * @功能: 硬件IIC发送一个字节数据
  71.   * @输入: I2Cx:     IIC组
  72.   *        SlaveAdd:从设备时识别地址
  73.   *        WriteAdd: 写入EEPROM内存地址
  74.   *        Data:     写入的数据
  75.   * @返回: *err:     返回的错误值
  76. */
  77. void IICWriteOneByte(I2C_TypeDef* IICx, uint08 SlaveAdd, uint08 WriteAdd, uint08 Data, uint08 * err)
  78. {
  79.         u16 temp = 0;
  80.        
  81.         while (I2C_GetFlagStatus(IICx, I2C_FLAG_BUSY))/*等待IIC*/
  82.         {
  83.                 temp++;
  84.                 if (temp > 800)
  85.                 {
  86.                         *err |= 1<<0;
  87.                         I2C_GenerateSTOP(IICx, ENABLE);/*产生停止信号*/
  88.                         return;
  89.                 }
  90.         }
  91.        
  92.         I2C_GenerateSTART(IICx, ENABLE);/*产生起始信号*/
  93.         temp = 0;

  94.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_MODE_SELECT))
  95.         {
  96.                 temp++;
  97.                 if (temp > 800)
  98.                 {
  99.                         *err |= 1<<1;
  100.                         I2C_GenerateSTOP(IICx, ENABLE);
  101.                         return;
  102.                 }
  103.         }
  104.        
  105.         I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Transmitter);/*发送设备地址*/
  106.         temp = 0;

  107.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){
  108.                 temp++;
  109.                 if (temp > 1000){
  110.                         *err |= 1<<2;
  111.                         I2C_GenerateSTOP(IICx, ENABLE);
  112.                         return;
  113.                 }
  114.         }
  115.        
  116.         temp = IICx->SR2;/*读取SR1寄存器后,对SR2寄存器的读操作将清除ADDR位*/
  117.        
  118.         I2C_SendData(IICx, WriteAdd);/*发送存储地址*/
  119.         temp = 0;

  120.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)){
  121.                 temp++;
  122.                 if (temp > 800)        {
  123.                         *err |= 1<<3;
  124.                         I2C_GenerateSTOP(IICx, ENABLE);
  125.                         return;
  126.                 }
  127.         }
  128.         I2C_SendData(IICx, Data);/*发送数据*/
  129.         temp = 0;

  130.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  131.         {
  132.                 temp++;
  133.                 if (temp > 800)
  134.                 {
  135.                         *err |= 1<<4;
  136.                         I2C_GenerateSTOP(IICx, ENABLE);
  137.                         return;
  138.                 }
  139.         }
  140.         I2C_GenerateSTOP(IICx, ENABLE);
  141. }

  142. /*****************************************************************************
  143.   * @功能: 硬件IIC读取一个字节数据
  144.   * @输入: I2Cx:     IIC组
  145.   *        SlaveAdd: 作为从设备时识别地址
  146.   *        ReadAdd:  读取的EEPROM内存地址
  147.   * @返回: *err:     返回的错误值
  148.   *            读取到的数据
  149. */
  150. uint08 IIC_ReadOneByte(I2C_TypeDef* IICx, uint08 SlaveAdd, uint08 ReadAdd, uint08 * err)
  151. {
  152.         vuint16 i = 0;
  153.         vuint08 temp = 0;
  154.         vuint16 flag = 0;
  155.        
  156.         while (I2C_GetFlagStatus(IICx, I2C_FLAG_BUSY)){
  157.                 i++;
  158.                 if (i > 800){
  159.                         *err |= 1<<0;
  160.                         I2C_GenerateSTOP(IICx, ENABLE);
  161.                         return 0;
  162.                 }
  163.         }
  164.         I2C_GenerateSTART(IICx, ENABLE);
  165.        
  166.         i = 0;
  167.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_MODE_SELECT)){
  168.                 i++;
  169.                 if (i > 1000){
  170.                         *err |= 1<<1;
  171.                         I2C_GenerateSTOP(IICx, ENABLE);
  172.                         return 0;
  173.                 }
  174.         }
  175.         I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Transmitter);
  176.         i = 0;
  177.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){
  178.                 if (i > 1000){
  179.                         *err |= 1<<2;
  180.                         I2C_GenerateSTOP(IICx, ENABLE);
  181.                         return 0;
  182.                 }
  183.         }
  184.         flag = IICx->SR2;
  185.        
  186.         I2C_SendData(IICx, ReadAdd);
  187.         i = 0;
  188.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)){
  189.                 i++;
  190.                 if (i > 2000){
  191.                         *err |= 1<<3;
  192.                         I2C_GenerateSTOP(IICx, ENABLE);
  193.                         return 0;
  194.                 }
  195.         }
  196.         I2C_GenerateSTART(IICx, ENABLE);
  197.         i = 0;
  198.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_MODE_SELECT)){
  199.                 i++;
  200.                 if (i > 800){
  201.                         *err |= 1<<4;
  202.                         I2C_GenerateSTOP(IICx, ENABLE);
  203.                         return 0;
  204.                 }
  205.         }
  206.         I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Receiver);
  207.         i = 0;
  208.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){//EV6
  209.                 i++;
  210.                 if (i > 800){
  211.                         *err |= 1<<5;
  212.                         I2C_GenerateSTOP(IICx, ENABLE);
  213.                         return 0;
  214.                 }
  215.         }
  216.         flag = IICx->SR2;
  217.        
  218.         I2C_AcknowledgeConfig(IICx, DISABLE);/*发送NACK*/
  219.         I2C_GenerateSTOP(IICx, ENABLE);
  220.         i = 0;
  221.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_RECEIVED)){
  222.                 i++;
  223.                 if (i > 1000){
  224.                         *err |= 1<<6;
  225.                         I2C_GenerateSTOP(IICx, ENABLE);
  226.                         return 0;
  227.                 }
  228.         }
  229.         temp = I2C_ReceiveData(IICx);
  230.         I2C_AcknowledgeConfig(IICx, ENABLE);
  231.        
  232.         return temp;
  233. }

  234. /*****************************************************************************
  235.   * @功能: 硬件IIC发送多个字节数据
  236.   * @输入: I2Cx:       IIC组
  237.   *        SlaveAdd:   作为从设备时识别地址
  238.   *        WriteAdd:   写入EEPROM内存起始地址
  239.   *        NumToWrite: 写入数据量
  240.   *        *pBuffer:   写入的数据组缓存
  241.   * @输出: *err:       返回的错误值
  242. */
  243. void IIC_WriteNByte(I2C_TypeDef * IICx, uint08 SlaveAdd, uint16 WriteAdd, uint08 NumToWrite, uint08 * pBuffer, u8 * err)
  244. {
  245.         vuint16 temp = 0;
  246.         vuint16 Addr = WriteAdd;
  247.        
  248.         while (I2C_GetFlagStatus(IICx, I2C_FLAG_BUSY)){
  249.                 temp++;
  250.                 if (temp > 1000)        {
  251.                         *err |= 1<<0;
  252.                         I2C_GenerateSTOP(IICx, ENABLE);
  253.                         return;
  254.                 }
  255.         }
  256.         I2C_GenerateSTART(IICx, ENABLE);
  257.         temp = 0;
  258.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_MODE_SELECT))
  259.         {
  260.                 temp++;
  261.                 if (temp > 1000)        {
  262.                         *err |= 1<<1;
  263.                         I2C_GenerateSTOP(IICx, ENABLE);
  264.                         return;
  265.                 }
  266.         }
  267.         I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Transmitter);
  268.         temp = 0;
  269.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){
  270.                 temp++;
  271.                 if (temp > 1000){
  272.                         *err |= 1<<2;
  273.                         I2C_GenerateSTOP(IICx, ENABLE);
  274.                         return;
  275.                 }
  276.         }
  277.         temp = IICx->SR2;
  278. //        if (Addr & 0xff00){
  279.                 I2C_SendData(IICx, (uint08)(Addr >> 8));  /*发送存储高8位地址*/
  280.                 temp = 0;
  281.                 while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)){//EV8
  282.                         temp++;
  283.                         if (temp > 1000){
  284.                                 *err |= 1<<3;
  285.                                 I2C_GenerateSTOP(IICx, ENABLE);
  286.                                 return;
  287.                         }
  288.                 }
  289.         //}
  290.         I2C_SendData(IICx, (Addr & 0x00ff));  /*发送存储低8位地址*/
  291.         temp = 0;
  292.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)){//EV8
  293.                 temp++;
  294.                 if (temp > 1000){
  295.                         *err |= 1<<3;
  296.                         I2C_GenerateSTOP(IICx, ENABLE);
  297.                         return;
  298.                 }
  299.         }
  300.         while (NumToWrite--){
  301.                 I2C_SendData(IICx, *pBuffer);  /*发送数据*/
  302.                 pBuffer++;
  303.                 temp = 0;
  304.                 while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){
  305.                         temp++;
  306.                         if (temp > 1000){
  307.                                 *err |= 1<<4;
  308.                                 I2C_GenerateSTOP(IICx, ENABLE);
  309.                                 return;
  310.                         }
  311.                 }
  312.         }
  313.         I2C_GenerateSTOP(IICx, ENABLE);
  314. }

  315. /******************************************************************************
  316.   * @功能: 硬件IIC读取多个字节数据
  317.   * @输入: I2Cx:      IIC组
  318.   *        SlaveAdd:  作为从设备时识别地址
  319.   *        ReadAdd:   读取的EEPROM内存起始地址
  320.   *        NumToRead: 读取数量
  321.   * @输出: *pBuffer: 数据输出缓冲区
  322. **/
  323. void IIC_PageRead(I2C_TypeDef* IICx, uint08 SlaveAdd, uint16 ReadAdd, uint08 NumToRead, uint08 * pBuffer, uint08 * err)
  324. {
  325.         vuint16 i = 0;
  326.         vuint16 temp = 0;
  327.         vuint16 Addr = ReadAdd;
  328.        
  329.         while (I2C_GetFlagStatus(IICx, I2C_FLAG_BUSY)){
  330.                 i++;
  331.                 if (i > 1000){
  332.                         *err |= 1<<0;
  333.                         I2C_GenerateSTOP(IICx, ENABLE);
  334.                         return;
  335.                 }
  336.         }
  337.         I2C_GenerateSTART(IICx, ENABLE);
  338.         i = 0;
  339.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_MODE_SELECT)){
  340.                 i++;
  341.                 if (i > 800){
  342.                         *err |= 1<<1;
  343.                         I2C_GenerateSTOP(IICx, ENABLE);
  344.                         return;
  345.                 }
  346.         }
  347.         I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Transmitter);
  348.         i = 0;
  349.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){
  350.                 i++;
  351.                 if (i > 1000){
  352.                         *err |= 1<<2;
  353.                         I2C_GenerateSTOP(IICx, ENABLE);
  354.                         return;
  355.                 }
  356.         }
  357.         i = IICx->SR2;
  358.        
  359. //        if (Addr & 0xff00){
  360.                 I2C_SendData(IICx, (uint08)(Addr >> 8));  /*发送存储高8位地址*/
  361.                 i = 0;
  362.                 while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)){//EV8
  363.                         i++;
  364.                         if (i > 2000){
  365.                                 *err |= 1<<3;
  366.                                 I2C_GenerateSTOP(IICx, ENABLE);  /*出错,产生停止信号*/
  367.                                 return;
  368.                         }
  369.                 }
  370. //        }
  371.         I2C_SendData(IICx, (uint08)(Addr & 0x00ff));  /*发送存储低8位地址*/
  372.         i = 0;
  373.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)){//EV8
  374.                 i++;
  375.                 if (i > 2000){
  376.                         *err |= 1<<3;
  377.                         I2C_GenerateSTOP(IICx, ENABLE);
  378.                         return;
  379.                 }
  380.         }
  381.         I2C_GenerateSTART(IICx, ENABLE);
  382.         i = 0;
  383.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_MODE_SELECT)){//EV5
  384.                 i++;
  385.                 if (i > 800){
  386.                         *err |= 1<<4;
  387.                         I2C_GenerateSTOP(IICx, ENABLE);
  388.                         return;
  389.                 }
  390.         }
  391.         I2C_Send7bitAddress(IICx, SlaveAdd, I2C_Direction_Receiver);
  392.         i = 0;
  393.         while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){
  394.                 i++;
  395.                 if (i > 800)
  396.                 {
  397.                         *err |= 1<<5;
  398.                         I2C_GenerateSTOP(IICx, ENABLE);
  399.                         return;
  400.                 }
  401.         }
  402.         i = IICx->SR2;
  403.        
  404.         while (NumToRead){/*批量接收数据*/
  405.                 if (NumToRead == 1){  /*最后一个数据了,不发送应答信号*/
  406.                         I2C_AcknowledgeConfig(IICx, DISABLE);  /*发送NACK*/
  407.                         I2C_GenerateSTOP(IICx, ENABLE);
  408.                 }
  409.                 if (I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_RECEIVED)){
  410.                         *pBuffer = I2C_ReceiveData(IICx);
  411.                         pBuffer++;
  412.                         NumToRead--;
  413.                 }
  414.         }
  415.         I2C_AcknowledgeConfig(IICx, ENABLE);
  416. }

  417. /*****************************************************************************
  418.   * @功能: AT24Cxx页写函数
  419.   *
  420.   * @输入: I2Cx:       IIC组
  421.   *        SlaveAdd:   从设备地址
  422.   *        WriteAdd:   写入EEPROM内存起始地址
  423.   *        NumToWrite: 写入数据量
  424.   *        *pBuffer:   写入的数据组缓存
  425.   *
  426. */
  427. void IIC_PageWrite(I2C_TypeDef * IICx, uint08 SlaveAdd, uint16 WriteAdd, uint08 NumToWrite, uint08 * pBuffer, uint08 * err)
  428. {
  429.         vuint16 Num_Page = 0;  /*按照页大小需要写入的次数*/
  430.         vuint16 Num_Remain = 0;  /*页写剩余字节数*/
  431.         vuint16 Addr = 0;  /*数据块首地址为EEPROM页数整数倍*/
  432.         vuint16 cnt = 0;  
  433.        
  434.         wp_BL24Cxx = 0;
  435.        
  436.         Addr = WriteAdd % AT24Cxx_PageSize;  /*计算数据块首地址是否是页大小的整数倍*/
  437.         cnt = AT24Cxx_PageSize - Addr;
  438.         Num_Page = NumToWrite / AT24Cxx_PageSize;  /*得到次数*/
  439.         Num_Remain = NumToWrite % AT24Cxx_PageSize;  /*剩余字节数*/
  440.        
  441.         if (Addr == 0){  /*是整数倍*/
  442.                 if (Num_Page == 0){ *
  443.                         IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, Num_Remain, pBuffer, err);  /*小于一个页大小数据*/
  444.                         IICWaiteStandby(IICx, SlaveAdd);  //等待操作完成
  445.                 }
  446.                 else{  /*大于一页数据*/
  447.                         while (Num_Page--){  /*按照页来写*/
  448.                                 IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, AT24Cxx_PageSize, pBuffer, err);
  449.                                 IICWaiteStandby(IICx, SlaveAdd);
  450.                                 WriteAdd += AT24Cxx_PageSize;
  451.                                 pBuffer += AT24Cxx_PageSize;
  452.                         }
  453.                         if (Num_Remain != 0){  /*不够一个页的数据*/
  454.                                 IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, Num_Remain, pBuffer, err);
  455.                                 IICWaiteStandby(IICx, SlaveAdd);
  456.                         }
  457.                 }
  458.         }
  459.         else { /*不是整数倍*/
  460.                 if (Num_Page == 0){
  461.                         IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, Num_Remain, pBuffer, err);  /*写入小于一个页的数据量*/
  462.                         IICWaiteStandby(IICx, SlaveAdd);
  463.                 }
  464.                 else {
  465.                         NumToWrite -= cnt;
  466.                         Num_Page = NumToWrite / AT24Cxx_PageSize;
  467.                         Num_Remain = NumToWrite % AT24Cxx_PageSize;
  468.                        
  469.                         if (cnt != 0){
  470.                                 IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, cnt, pBuffer, err);
  471.                                 IICWaiteStandby(IICx, SlaveAdd);
  472.                                 WriteAdd += cnt;
  473.                                 pBuffer += cnt;
  474.                         }
  475.                         while (Num_Page--) { /*按照页来写*/
  476.                                 IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, AT24Cxx_PageSize, pBuffer, err);
  477.                                 IICWaiteStandby(IICx, SlaveAdd);
  478.                                 WriteAdd += AT24Cxx_PageSize;
  479.                                 pBuffer += AT24Cxx_PageSize;
  480.                         }
  481.                         if (Num_Remain != 0) {
  482.                                 IIC_WriteNByte(IICx, SlaveAdd, WriteAdd, Num_Remain, pBuffer, err);  /*小于一个页大小数据*/
  483.                                 IICWaiteStandby(IICx, SlaveAdd);
  484.                         }
  485.                 }
  486.         }
  487.         wp_BL24Cxx = 1;
  488. }
  489. /*****************************************************************************
  490.   * @功能: 确定系统是否有AT24Cxx
  491.   * @输入: I2Cx:       IIC组
  492.   *       
  493.   * @返回: 1:检测到AT24Cxx,0:没有检测到AT24Cxx
  494. */
  495. uint08 AT24CXX_Check(I2C_TypeDef * IICx)
  496. {
  497.         vuint08 temp;
  498.         vuint08 i;
  499.         temp = IIC_ReadOneByte(IICx ,BL2408Add, 0,&i);          
  500.         if(temp == 0x55){
  501.                 return 1;       
  502.         }               
  503.         else {
  504.                 wp_BL24Cxx = 0;
  505.                 IICWriteOneByte(IICx ,BL2408Add, 0,0x55,&i);
  506.         temp = IIC_ReadOneByte(IICx ,BL2408Add, 0,&i);       
  507.                 wp_BL24Cxx = 1;
  508.                 if(temp == 0x55)return 1;
  509.         }
  510.         return 0;                                                                                          
  511. }
复制代码



评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-9-12 11:31:54 | 显示全部楼层
感谢分享! 赞一个
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106718
QQ
发表于 2020-9-13 00:49:07 | 显示全部楼层
非常感谢楼主分享。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-9-15 15:31:35 | 显示全部楼层

感谢分享! 赞一个
回复

使用道具 举报

3

主题

48

回帖

57

积分

初级会员

积分
57
发表于 2021-9-23 15:48:31 | 显示全部楼层
先收藏了,后面有用到
回复

使用道具 举报

1

主题

60

回帖

63

积分

初级会员

积分
63
发表于 2024-3-8 12:14:08 | 显示全部楼层
为什么在写多字节的时候,写地址后,会超时呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106718
QQ
发表于 2024-3-9 00:47:52 | 显示全部楼层
world_all 发表于 2024-3-8 12:14
为什么在写多字节的时候,写地址后,会超时呢?

没收到应答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 22:12 , Processed in 0.292593 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表