343 lines
6.8 KiB
C
343 lines
6.8 KiB
C
|
|
|
|||
|
|
#include "i2crw.h"
|
|||
|
|
|
|||
|
|
#ifndef MAX_MSG_NUM
|
|||
|
|
#define MAX_MSG_NUM 0
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
#if (MAX_MSG_NUM > 0)
|
|||
|
|
|
|||
|
|
|
|||
|
|
#ifndef MAX_MSG_DAT_LEN
|
|||
|
|
#define MAX_MSG_DAT_LEN 128
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
int transDir; // <20><><EFBFBD>䷽<EFBFBD><E4B7BD>
|
|||
|
|
int transSteps; // <20><><EFBFBD>䲽<EFBFBD><E4B2BD>
|
|||
|
|
u8 slaveAddr; // <20>ӽڵ<D3BD><DAB5><EFBFBD>ַ
|
|||
|
|
u8 regAddr; // <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
|
|||
|
|
u8 datbuff[MAX_MSG_DAT_LEN]; // <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int dataNums; // <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
int datIndex; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
|
|||
|
|
}TransI2cMsg;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>䷽<EFBFBD><E4B7BD>
|
|||
|
|
#define TRANS_DIR_RD 0
|
|||
|
|
#define TRANS_DIR_WR 1
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>䲽<EFBFBD><E4B2BD>
|
|||
|
|
#define TRANS_STEP_FREE 0 // <20><><EFBFBD><EFBFBD>
|
|||
|
|
#define TRANS_STEP_START 1 // <20><><EFBFBD><EFBFBD>
|
|||
|
|
#define TRANS_STEP_R_START 2 // <20>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define TRANS_STEP_ADDR 3 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
#define TRANS_STEP_RDDAT 4 // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
#define TRANS_STEP_FINISH 5 // <20><><EFBFBD><EFBFBD>
|
|||
|
|
#define TRANS_STEP_ERROR 6 // <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
TransI2cMsg g_msgList[10];
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef enum
|
|||
|
|
{
|
|||
|
|
i2cWrite,
|
|||
|
|
i2cRead
|
|||
|
|
} I2cDirection;
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef enum
|
|||
|
|
{
|
|||
|
|
I2C_STATUS_FREE = 0,
|
|||
|
|
I2C_STATUS_START,
|
|||
|
|
I2C_STATUS_ADDRESS,
|
|||
|
|
I2C_STATUS_START_R,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ڶ<EFBFBD><DAB6>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>ź<EFBFBD>
|
|||
|
|
I2C_STATUS_REDATA,
|
|||
|
|
I2C_STATUS_FINSIH,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
I2C_STATUS_ERR,//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
}I2C_STATUS;
|
|||
|
|
|
|||
|
|
typedef struct _I2cMessage
|
|||
|
|
{
|
|||
|
|
uint32_t Length;
|
|||
|
|
uint32_t Index;
|
|||
|
|
uint8_t slaveAddress;
|
|||
|
|
I2cDirection direction;
|
|||
|
|
I2C_STATUS status;
|
|||
|
|
uint16_t regAddress;
|
|||
|
|
uint8_t *buffer;
|
|||
|
|
} I2cMessage;
|
|||
|
|
|
|||
|
|
|
|||
|
|
static I2cMessage Message;
|
|||
|
|
|
|||
|
|
|
|||
|
|
void i2cdrvInitBus()
|
|||
|
|
{
|
|||
|
|
I2C_InitTypeDef I2C_InitStructure;
|
|||
|
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|||
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|||
|
|
|
|||
|
|
|
|||
|
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
|
|||
|
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
|
|||
|
|
|
|||
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
|||
|
|
|
|||
|
|
|
|||
|
|
GPIO_StructInit(&GPIO_InitStructure);
|
|||
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|||
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
|||
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
|||
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // SCL
|
|||
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|||
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // SDA
|
|||
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|||
|
|
|
|||
|
|
|
|||
|
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
|
|||
|
|
GPIO_PinAFConfig(GPIOB, GPIO_Pin_9Source, GPIO_AF_I2C1);
|
|||
|
|
|
|||
|
|
I2C_DeInit(I2C1);
|
|||
|
|
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
|||
|
|
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
|||
|
|
I2C_InitStructure.I2C_OwnAddress1 = 0x30;;
|
|||
|
|
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
|||
|
|
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
|||
|
|
I2C_InitStructure.I2C_ClockSpeed = 400000;
|
|||
|
|
I2C_Init(I2C1, &I2C_InitStructure);
|
|||
|
|
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);
|
|||
|
|
|
|||
|
|
NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
|
|||
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
|
|||
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|||
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|||
|
|
NVIC_Init(&NVIC_InitStructure);
|
|||
|
|
NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
|
|||
|
|
NVIC_Init(&NVIC_InitStructure);
|
|||
|
|
|
|||
|
|
GPIO_SetBits(GPIOB, GPIO_Pin_8);
|
|||
|
|
GPIO_SetBits(GPIOB, GPIO_Pin_9);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
bool i2cdevRead(uint8_t devAddr, uint8_t ReadAddr, uint8_t DatasLen, uint8_t *DataRead)
|
|||
|
|
{
|
|||
|
|
int waitTime;
|
|||
|
|
Message.status = I2C_STATUS_START;
|
|||
|
|
Message.slaveAddress = devAddr;
|
|||
|
|
Message.Index = 0;
|
|||
|
|
|
|||
|
|
Message.buffer = DataRead;
|
|||
|
|
|
|||
|
|
Message.Length = DatasLen;
|
|||
|
|
Message.regAddress = ReadAddr;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
Message.direction = i2cRead;
|
|||
|
|
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT, ENABLE);
|
|||
|
|
I2C1->CR1 = (I2C_CR1_START | I2C_CR1_PE);//1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>ж<EFBFBD>
|
|||
|
|
waitTime = clock();
|
|||
|
|
while (1)//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (Message.status == I2C_STATUS_FINSIH)
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (Message.status == I2C_STATUS_ERR)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (clock() - waitTime > 10)
|
|||
|
|
{
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
bool i2cdevWriteByte(uint8_t devAddr, uint8_t WriteAddr, uint8_t DataToWrite)
|
|||
|
|
{
|
|||
|
|
int waitTime;
|
|||
|
|
Message.status = I2C_STATUS_START;
|
|||
|
|
Message.slaveAddress = devAddr;
|
|||
|
|
Message.Index = 0;
|
|||
|
|
|
|||
|
|
Message.buffer = &DataToWrite;
|
|||
|
|
|
|||
|
|
Message.Length = 1;
|
|||
|
|
Message.regAddress = WriteAddr;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
Message.direction = i2cWrite;
|
|||
|
|
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT, ENABLE);
|
|||
|
|
I2C1->CR1 = (I2C_CR1_START | I2C_CR1_PE);//1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>ж<EFBFBD>
|
|||
|
|
waitTime = clock();
|
|||
|
|
while (1)//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (Message.status == I2C_STATUS_FINSIH)
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (Message.status == I2C_STATUS_ERR)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (clock() - waitTime > 10)
|
|||
|
|
{
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void I2C1_ER_IRQHandler(void)
|
|||
|
|
{
|
|||
|
|
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_AF))
|
|||
|
|
{
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
|
|||
|
|
|
|||
|
|
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
|
|||
|
|
|
|||
|
|
Message.status = I2C_STATUS_ERR;
|
|||
|
|
}
|
|||
|
|
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_BERR))
|
|||
|
|
{
|
|||
|
|
I2C_ClearFlag(I2C1, I2C_FLAG_BERR);
|
|||
|
|
}
|
|||
|
|
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_OVR))
|
|||
|
|
{
|
|||
|
|
I2C_ClearFlag(I2C1, I2C_FLAG_OVR);
|
|||
|
|
}
|
|||
|
|
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_ARLO))
|
|||
|
|
{
|
|||
|
|
I2C_ClearFlag(I2C1, I2C_FLAG_ARLO);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void I2C1_EV_IRQHandler()
|
|||
|
|
{
|
|||
|
|
uint16_t SR1;
|
|||
|
|
uint16_t SR2;
|
|||
|
|
|
|||
|
|
SR1 = I2C1->SR1;
|
|||
|
|
|
|||
|
|
// Start bit event
|
|||
|
|
if (SR1 & I2C_SR1_SB)
|
|||
|
|
{
|
|||
|
|
if (Message.status == I2C_STATUS_START)
|
|||
|
|
{
|
|||
|
|
I2C_Send7bitAddress(I2C1, Message.slaveAddress << 1, I2C_Direction_Transmitter);//2
|
|||
|
|
Message.status = I2C_STATUS_ADDRESS;
|
|||
|
|
}
|
|||
|
|
else if (Message.status == I2C_STATUS_START_R)
|
|||
|
|
{
|
|||
|
|
I2C_AcknowledgeConfig(I2C1, ENABLE);//5 תΪ<D7AA><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
I2C_Send7bitAddress(I2C1, Message.slaveAddress << 1, I2C_Direction_Receiver);
|
|||
|
|
Message.status = I2C_STATUS_REDATA;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (SR1 & I2C_SR1_ADDR)//<2F><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
SR2 = I2C1->SR2;
|
|||
|
|
|
|||
|
|
if (Message.status == I2C_STATUS_ADDRESS)//<2F><><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
{
|
|||
|
|
I2C_SendData(I2C1, Message.regAddress);//4 <20><><EFBFBD>͵<EFBFBD>ַ
|
|||
|
|
}
|
|||
|
|
if (Message.Length == 1)//ֻ<><D6BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (Message.status == I2C_STATUS_REDATA)
|
|||
|
|
{
|
|||
|
|
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if (SR1 & I2C_SR1_BTF)
|
|||
|
|
{
|
|||
|
|
//4 <20>ϴδ<CFB4><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (SR1&I2C_SR1_TXE)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (Message.direction == i2cRead)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (Message.status == I2C_STATUS_ADDRESS)//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
I2C1->CR1 = (I2C_CR1_START | I2C_CR1_PE);//
|
|||
|
|
Message.status = I2C_STATUS_START_R;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else//д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
I2C_SendData(I2C1, Message.buffer[Message.Index++]);
|
|||
|
|
if (Message.Index == Message.Length)
|
|||
|
|
{
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);//<2F>ر<EFBFBD><D8B1>ж<EFBFBD>
|
|||
|
|
I2C1->CR1 = (I2C_CR1_STOP | I2C_CR1_PE);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Message.status = I2C_STATUS_FINSIH;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (SR1 & I2C_SR1_RXNE)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
Message.buffer[Message.Index++] = I2C_ReceiveData(I2C1);
|
|||
|
|
|
|||
|
|
if (Message.Index == Message.Length - 1)
|
|||
|
|
{
|
|||
|
|
I2C_AcknowledgeConfig(I2C1, DISABLE);//ĩβ<C4A9><CEB2><EFBFBD>ݽ<EFBFBD>ֹӦ<D6B9><D3A6>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (Message.Index == Message.Length)
|
|||
|
|
{
|
|||
|
|
I2C1->CR1 = (I2C_CR1_STOP | I2C_CR1_PE);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);//<2F><><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
|
|||
|
|
Message.status = I2C_STATUS_FINSIH;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (SR1 & I2C_SR1_TXE)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
*/
|