i2c出问题了

[复制链接]
查看7330 | 回复0 | 2017-9-13 15:58:11 | 显示全部楼层 |阅读模式
芯片SN32F108,原来是接mpu6050的,拆掉6050飞线改成了触摸板。
继续用原来的代码(地址改了,其他不变)就出问题了,scl,sda两条线就变成了低电平。i2c也不发送地址,也没有变化想求助一下是可能哪里出现的问题。代码如下:

/*_____ I N C L U D E S ____________________________________________________*/
#include "SN32F100.h"
#include "I2C.h"
#include "UART.h"
/*_____ D E C L A R A T I O N S ____________________________________________*/
//------------------I2C-------------------------
//Check Flag
volatile uint32_t Timeout_Flag = 0;
volatile uint32_t Arbitration_Flag = 0;

//Error Flag
volatile uint32_t I2C_Register_Check_Error = 0;
volatile uint32_t I2C_Total_Error = 0;

//Use I2C0 Register
volatile uint32_t wI2C1_TXNumber = 0;
volatile uint32_t wI2C1_RXNumber = 0;
volatile uint32_t wI2C1_RepeatFun = 0;
volatile uint16_t hwI2C1_Device_Addr = 0;
volatile uint8_t bI2C1_EndMTxFlagI2C = 0;

volatile uint8_t bI2C1_EnableStopFlag = 0;

//------------------Master Tx-------------------------
//TX FIFO
volatile uint8_t bI2C1_TxM_Data[10];
volatile uint8_t bI2C1_TxM_Pointer = 0;
int count = 0;

//Tx Control Flag
volatile uint32_t Master_Tx_Ctr=0;

//------------------Master Rx-------------------------
//RX FIFO
volatile uint8_t bI2C1_RxM_Data[16];
volatile uint8_t bI2C1_RxM_Pointer = 0;

//Rx Control Flag
volatile uint32_t Return_Nack_Flag=0;


/*_____ D E F I N I T I O N S ______________________________________________*/


/*_____ M A C R O S ________________________________________________________*/


/*_____ F U N C T I O N S __________________________________________________*/

/*****************************************************************************
* Function                : I2C1_Init
* Description        : Set specified value to specified bits of assigned register
* Input                        : wI2C0SCLH - SCL High Time
*                                  wI2C0SCLL - SCL Low Time
*                                  wI2C0Mode - 0: Standard/Fast mode.1: Fast-mode Plus
* Output                : None
* Return                : None
* Note                        : None
*****************************************************************************/
void I2C1_Init(uint32_t wI2CSCLH, uint32_t wI2CSCLL)
{
        NVIC_EnableIRQ(I2C1_IRQn);
        NVIC_SetPriority(I2C1_IRQn,3);                                //set I2C priority

        //AHB Clock
        SN_SYS1->AHBCLKEN |= 0x0100000;

        //I2C Speed
        SN_I2C1->SCLHT = wI2CSCLH;
        SN_I2C1->SCLLT = wI2CSCLL;

        //Mointer Mode
        SN_I2C1->MMCTRL = 0x00;

        //I2C Enable
        SN_I2C1->CTRL = 0x100;                //Enable I2C standard mode
       
}

/*****************************************************************************
* Function                : I2C_Timeout_Ctrl
* Description        : Set specified value to specified bits of assigned register
* Input                        : bI2CNo - choise I2C0 is 0, I2C1 is 1
*                                  wI2CTo - TimeOut Value: wI2CTo * 32 * I2C_PCLK cycle
* Output                : None
* Return                : None
* Note                        : None
*****************************************************************************/
void I2C_Timeout_Ctrl(uint8_t bI2CNo, uint32_t wI2CTo)
{
        if(bI2CNo == 0x00)
        {
                SN_I2C1->TOCTRL = wI2CTo;
        }
        else if(bI2CNo == 0x01)
        {
                SN_I2C1->TOCTRL = wI2CTo;
        }
}

/*****************************************************************************
* Function                : I2C1_Engine
* Description        : None
* Input                                : wTXNumber - Number of bytes send from bI2C1_TxM_Data[]
*                                                                wRepaetFun - 0 : No use.
*                                                                                                         1: Next transfer with a Repated Start condition.
*                                                                                                         2: Work next transfer.
*                                                                wRXNumber - Number of bytes read to bI2C1_RxM_Data[]
*                                                                bStopFlagOpen - 0: Check Stop Flag, 1:No Check Stop Flag
* Output                        : None
* Return                        : None
* Note                                : None
*****************************************************************************/
void I2C1_Engine(uint32_t wTXNumber, uint32_t wRepeatFun, uint32_t wRXNumber, uint8_t bStopFlagOpen)
{
        wI2C1_TXNumber = wTXNumber;
        wI2C1_RepeatFun = wRepeatFun;
        wI2C1_RXNumber = wRXNumber;

        bI2C1_EnableStopFlag = 1;
        SN_I2C1->CTRL |= (0x01 << 5);
        if(bStopFlagOpen == 0)
        {
                while (bI2C1_EndMTxFlagI2C == 0);
                bI2C1_EndMTxFlagI2C = 0;
                bI2C1_EnableStopFlag = 0;
        }
}

/*****************************************************************************
* Function                : I2C_Master_Tx
* Description        : Set specified value to specified bits of assigned register
* Input                        :
*                                  wTxNum - Set the Number of sending Data
*                                  wRepeatTX - 0 : No use. 1: Next transfer with a Repated Start condition. 2: Work next transfer.  
*                                  wRxNum - Set the Number of getting Data
* Output                : None
* Return                : None
* Note                        : None
*****************************************************************************/
void I2C_Master_Tx(volatile uint8_t bSlaveAddress, volatile uint32_t wTxNum, volatile uint32_t wRepeat, volatile uint32_t wRxNum)
{
        uint32_t wDeboundNum = 0;
       
        if(((SN_I2C1->STAT) & (0x0200)) != 0x00)                         //Timeout State
        {
                SN_I2C1->STAT |= 0x08000;
                Timeout_Flag = 1;                                                               
        }
        else if(((SN_I2C1->STAT) & (0x0100)) == (0x0100))        //ARB State       
        {
                SN_I2C1->STAT |= 0x08000;
                Arbitration_Flag = 1;
        }
        else if(((SN_I2C1->STAT) & (0x0018)) == (0x0008))        //Stop Down
        {
                SN_I2C1->STAT |= 0x08000;       
          bI2C1_TxM_Pointer = 0x00;
                bI2C1_RxM_Pointer = 0x00;
          Master_Tx_Ctr = 0x00;
                Return_Nack_Flag = 0x00;
                bI2C1_EndMTxFlagI2C = 1;
        }
        else if(((SN_I2C1->STAT) & (0x0038)) == (0x0038))        //Start and Stop Down
        {
                SN_I2C1->STAT |= 0x08000;       
                if((Master_Tx_Ctr == 0x01) && (wRepeat != 0x00))
                {
                        /* START has been transmitted and prepare SLA+R */       
                        SN_I2C1->TXDATA = (bSlaveAddress << 0x01) | 0x01;
                }
                else
                {
                        /* START has been transmitted and prepare SLA+W */       
      SN_I2C1->TXDATA = (bSlaveAddress << 0x01);
                }
  }
        else
        {
                SN_I2C1->STAT |= 0x08000;
                switch (SN_I2C1->STAT)
                {                       
      case 0x0030:
                                if((Master_Tx_Ctr == 0x01) && (wRepeat != 0x00))
                                {
                                        /* START has been transmitted and prepare SLA+R读取从设备 */       
                                        SN_I2C1->TXDATA = (bSlaveAddress << 0x01) | 0x01;
                                }
                                else
                                {
                                        /* START has been transmitted and prepare SLA+W */
                                        SN_I2C1->TXDATA = (bSlaveAddress << 0x01);
                                }
                                break;
                       
                        /* SLA+W or Data has been transmitted and ACK has been received */
      case 0x0022:
                                if ((bI2C1_TxM_Pointer < wTxNum)&&(Master_Tx_Ctr == 0x00))
                                {                               
                                  SN_I2C1->TXDATA = bI2C1_TxM_Data[bI2C1_TxM_Pointer++];
        }
        else if ((bI2C1_TxM_Pointer == wTxNum)&&(Master_Tx_Ctr == 0x00))
               {   
                                        if(wRepeat == 0)                                                //No Repeat
                                        {
                                     SN_I2C1->CTRL |= 0x010;       
                      }
                             else if(wRepeat == 1)                                        //Repeat Start       
                             {
                                                SN_I2C1->CTRL |= 0x020;       
                                                Master_Tx_Ctr++;
                            }
                            else if(wRepeat == 2)                                        //Repeat Both
                             {
                                                SN_I2C1->CTRL |= 0x030;
                                                Master_Tx_Ctr++;
                                    }
                             else
                             {
//                          I2C_Register_Check_Error |= Error0;
//                                           I2C_Total_Error++;
                             }
                        }
                           else if ((wRxNum != 1)&&(Master_Tx_Ctr == 0x01))
                                {
                                        SN_I2C1->CTRL |= 0x04;        //Rx, ACK
                                }
                                else if ((wRxNum == 1)&&(Master_Tx_Ctr == 0x01))
                                {       
                                        SN_I2C1->CTRL |= 0x02;        //Rx, NACK
                                        Return_Nack_Flag++;
                                }
                                else
                                {
//          I2C_Register_Check_Error |= Error0;
//                                   I2C_Total_Error++;
                                }
        break;
                       
                        /* SLA+W or Data has been transmitted and NACK has been received */       
      case 0x0024:
        if ((bI2C1_TxM_Pointer == wTxNum)&&(Master_Tx_Ctr == 0x00))
              {  
                                        if(wRepeat == 0)                                                //No Repeat
                                        {
                                     SN_I2C1->CTRL |= 0x010;               
                       }
                            else if(wRepeat == 1)                                        //Repeat Start       
                             {
                                                SN_I2C1->CTRL |= 0x020;       
                                                Master_Tx_Ctr++;
                             }
                             else if(wRepeat == 2)                                        //Repeat Both
                             {
                                                SN_I2C1->CTRL |= 0x030;
                                                Master_Tx_Ctr++;
                             }
                             else
                             {
//                  I2C_Register_Check_Error |= Error0;
//                                           I2C_Total_Error++;
                             }         
        }
                                else
                                {
//          I2C_Register_Check_Error |= Error0;
//                                   I2C_Total_Error++;
                                }
        break;

                        /* RX with ACK/NACK transfer is down */       
      case 0x0021:
                                bI2C1_RxM_Data[bI2C1_RxM_Pointer++] = SN_I2C1->RXDATA;
                                wDeboundNum = wRxNum-1;
                                if(Return_Nack_Flag == 0x01)
                                {
                                        SN_I2C1->CTRL |= 0x010;
                                }
                                else if((bI2C1_RxM_Pointer < (wDeboundNum)))
                                {
                                                        //Return ACK
                                        SN_I2C1->CTRL |= 0x04;        //ACK
                                }
                                else if((bI2C1_RxM_Pointer >= (wDeboundNum)))
                                {
                                        //Return NACK
                                        SN_I2C1->CTRL |= 0x02;        //NACK
                                        Return_Nack_Flag++;
                                }
                            else
                    {
//                             I2C_Register_Check_Error |= Error0;
//                                  I2C_Total_Error++;
                            }
                          break;
                               
               /*Error State Check*/
        default:
//                          I2C_Register_Check_Error |= Error0;
//                           I2C_Total_Error++;
          break;
                }
        }
}

/*****************************************************************************
* Function                : I2C1_IRQHandler
* Description        : ISR of Hard fault interrupt
* Input                        : None
* Output                : None
* Return                : None
* Note                        : None
*****************************************************************************/
__irq void I2C1_IRQHandler(void)
{
        count += 1;
        I2C_Master_Tx(hwI2C1_Device_Addr, wI2C1_TXNumber, wI2C1_RepeatFun, wI2C1_RXNumber);       
//  UART0_SendByte ('a');
}


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

本版积分规则