芯片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');
}
|