1074 lines
45 KiB
C
1074 lines
45 KiB
C
#include "McuBspI2c.h"
|
|
|
|
typedef struct {
|
|
uint8_t Enable;
|
|
uint8_t I2cMode; // IIC工作模式
|
|
uint8_t SlaveAddress; // 从机地址
|
|
uint8_t I2cRead;
|
|
uint8_t I2cWrite;
|
|
uint32_t I2cSpeed; // IIC通信速率
|
|
} BSP_I2C_OBJ;
|
|
|
|
static BSP_I2C_OBJ gMcuBspI2cObj[MCU_BSP_I2C_ALL_NUM] = {0};
|
|
|
|
int McuBspI2cInit(uint8_t I2cId, uint32_t I2cSpeed, uint8_t I2cMode, uint8_t SlaveAddress)
|
|
{
|
|
if (I2cId >= MCU_BSP_I2C_ALL_NUM) {
|
|
return -1;
|
|
}
|
|
while ((gMcuBspI2cObj[I2cId].I2cRead == MCU_BSP_I2C_READ_ENABLE) ||
|
|
(gMcuBspI2cObj[I2cId].I2cWrite == MCU_BSP_I2C_WRITE_ENABLE)) {
|
|
}
|
|
gMcuBspI2cObj[I2cId].Enable = MCU_BSP_I2C_OFF;
|
|
gMcuBspI2cObj[I2cId].I2cMode = I2cMode;
|
|
gMcuBspI2cObj[I2cId].SlaveAddress = SlaveAddress;
|
|
gMcuBspI2cObj[I2cId].I2cSpeed = I2cSpeed;
|
|
if (I2cId == MCU_BSP_I2C0) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C0_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C0_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C0_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C0_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C0_SCL_GPIO, MCU_BSP_I2C0_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C0_SDA_GPIO, MCU_BSP_I2C0_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C0_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C0_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C0_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C1) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C1_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C1_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C1_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C1_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C1_SCL_GPIO, MCU_BSP_I2C1_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C1_SDA_GPIO, MCU_BSP_I2C1_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C1_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C1_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C1_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C2) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C2_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C2_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C2_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C2_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C2_SCL_GPIO, MCU_BSP_I2C2_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C2_SDA_GPIO, MCU_BSP_I2C2_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C2_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C2_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C2_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C3) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C3_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C3_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C3_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C3_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C3_SCL_GPIO, MCU_BSP_I2C3_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C3_SDA_GPIO, MCU_BSP_I2C3_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C3_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C3_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C3_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C4) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C4);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C4_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C4_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C4_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C4_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C4_SCL_GPIO, MCU_BSP_I2C4_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C4_SDA_GPIO, MCU_BSP_I2C4_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C4_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C4_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C4_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C5) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C5);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C5_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C5_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C5_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C5_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C5_SCL_GPIO, MCU_BSP_I2C5_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C5_SDA_GPIO, MCU_BSP_I2C5_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C5_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C5_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C5_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C6) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C6);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C6_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C6_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C6_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C6_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C6_SCL_GPIO, MCU_BSP_I2C6_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C6_SDA_GPIO, MCU_BSP_I2C6_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C6_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C6_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C6_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C7) {
|
|
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C7);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C7_SCL_GPIO_CLK);
|
|
SysCtlPeripheralEnable(MCU_BSP_I2C7_SDA_GPIO_CLK);
|
|
GPIOPinConfigure(MCU_BSP_I2C7_SCL_PIN_CONF);
|
|
GPIOPinConfigure(MCU_BSP_I2C7_SDA_PIN_CONF);
|
|
GPIOPinTypeI2CSCL(MCU_BSP_I2C7_SCL_GPIO, MCU_BSP_I2C7_SCL_GPIO_PIN);
|
|
GPIOPinTypeI2C(MCU_BSP_I2C7_SDA_GPIO, MCU_BSP_I2C7_SDA_GPIO_PIN);
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C7_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C7_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C7_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].Enable = MCU_BSP_I2C_ON;
|
|
return 0;
|
|
}
|
|
|
|
int McuBspI2cSendData(uint8_t I2cId, uint8_t SlaveAddress, uint8_t *SendData, uint32_t SendLen)
|
|
{
|
|
uint32_t i;
|
|
CPU_SR_ALLOC();
|
|
if (I2cId >= MCU_BSP_I2C_ALL_NUM) {
|
|
return -1;
|
|
}
|
|
if ((SendData == NULL) || (SendLen == 0) || (gMcuBspI2cObj[I2cId].Enable == MCU_BSP_I2C_OFF)) {
|
|
return -1;
|
|
}
|
|
OS_ENTER_CRITICAL();
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_ENABLE;
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cId == MCU_BSP_I2C0) {
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C0_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C0_BASE, *SendData);
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C0_BASE, SendData[i]);
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C0_BASE, SendData[i]);
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C0_BASE, SendData[i]);
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C0_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C1) {
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C1_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C1_BASE, *SendData);
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C1_BASE, SendData[i]);
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C1_BASE, SendData[i]);
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C1_BASE, SendData[i]);
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C1_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C2) {
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C2_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C2_BASE, *SendData);
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C2_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C2_BASE, SendData[i]);
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C2_BASE, SendData[i]);
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C2_BASE, SendData[i]);
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C2_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C2_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C3) {
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C3_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C3_BASE, *SendData);
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C3_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C3_BASE, SendData[i]);
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C3_BASE, SendData[i]);
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C3_BASE, SendData[i]);
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C3_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C3_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C4) {
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C4_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C4_BASE, *SendData);
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C4_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C4_BASE, SendData[i]);
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C4_BASE, SendData[i]);
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C4_BASE, SendData[i]);
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C4_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C4_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C5) {
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C5_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C5_BASE, *SendData);
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C5_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C5_BASE, SendData[i]);
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C5_BASE, SendData[i]);
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C5_BASE, SendData[i]);
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C5_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C5_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C6) {
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C6_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C6_BASE, *SendData);
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C6_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C6_BASE, SendData[i]);
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C6_BASE, SendData[i]);
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C6_BASE, SendData[i]);
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C6_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C6_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
}
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C7) {
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C7_BASE, SlaveAddress, false);
|
|
if (SendLen == 1) {
|
|
I2CMasterDataPut(I2C7_BASE, *SendData);
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_SINGLE_SEND);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C7_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < SendLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterDataPut(I2C7_BASE, SendData[i]);
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_SEND_START);
|
|
} else if (i == SendLen - 1) {
|
|
I2CMasterDataPut(I2C7_BASE, SendData[i]);
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
|
|
} else {
|
|
I2CMasterDataPut(I2C7_BASE, SendData[i]);
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C7_BASE)) {
|
|
if (i != SendLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C7_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
/* 从机模式代码,暂未开发 */
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cWrite = MCU_BSP_I2C_WRITE_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
|
|
int McuBspI2cRecvData(uint8_t I2cId, uint8_t SlaveAddress, uint8_t *RecvData, uint32_t RecvLen)
|
|
{
|
|
uint32_t i;
|
|
CPU_SR_ALLOC();
|
|
if (I2cId >= MCU_BSP_I2C_ALL_NUM) {
|
|
return -1;
|
|
}
|
|
if ((RecvData == NULL) || (RecvLen == 0) || (gMcuBspI2cObj[I2cId].Enable == MCU_BSP_I2C_OFF)) {
|
|
return -1;
|
|
}
|
|
OS_ENTER_CRITICAL();
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_ENABLE;
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cId == MCU_BSP_I2C0) {
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C0_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C0_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C0_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C0_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C1) {
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C1_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C1_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C1_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C1_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C2) {
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C2_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C2_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C2_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C2_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C2_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C2_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C3) {
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C3_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C3_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C3_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C3_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C3_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C3_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C4) {
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C4_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C4_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C4_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C4_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C4_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C4_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C5) {
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C5_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C5_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C5_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C5_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C5_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C5_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C6) {
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C6_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C6_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C6_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C6_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C6_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C6_BASE);
|
|
}
|
|
} else if (I2cId == MCU_BSP_I2C7) {
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
|
|
}
|
|
I2CMasterSlaveAddrSet(I2C7_BASE, SlaveAddress, true);
|
|
if (RecvLen == 1) {
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C7_BASE)) {
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
|
|
}
|
|
*RecvData = I2CMasterDataGet(I2C7_BASE);
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
for (i = 0; i < RecvLen; i++) {
|
|
if (i == 0) {
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
|
|
} else if (i == RecvLen - 1) {
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
|
|
} else {
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
|
|
}
|
|
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C7_BASE)) {
|
|
if (i != RecvLen - 1) {
|
|
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C7_BASE)) != I2C_MCS_ARBLST) {
|
|
I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return -1;
|
|
}
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
|
|
}
|
|
RecvData[i] = I2CMasterDataGet(I2C7_BASE);
|
|
}
|
|
}
|
|
} else {
|
|
/* 从机接收还没有开发 */
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cRead = MCU_BSP_I2C_READ_DISABLE;
|
|
OS_EXIT_CRITICAL();
|
|
return 0;
|
|
}
|
|
|
|
/* 修改IIC配置 */
|
|
int McuBspI2cModifyConf(uint8_t I2cId, uint32_t I2cSpeed, uint8_t I2cMode, uint8_t SlaveAddress)
|
|
{
|
|
if (I2cId >= MCU_BSP_I2C_ALL_NUM) {
|
|
return -1;
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].Enable == MCU_BSP_I2C_OFF) {
|
|
return -1;
|
|
}
|
|
while ((gMcuBspI2cObj[I2cId].I2cRead == MCU_BSP_I2C_READ_ENABLE) ||
|
|
(gMcuBspI2cObj[I2cId].I2cWrite == MCU_BSP_I2C_WRITE_ENABLE)) {
|
|
}
|
|
gMcuBspI2cObj[I2cId].Enable = MCU_BSP_I2C_OFF;
|
|
if (I2cId == MCU_BSP_I2C0) {
|
|
while(I2CMasterBusy(I2C0_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C0_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C0_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C0_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C0_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C0_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C1) {
|
|
while(I2CMasterBusy(I2C1_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C1_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C1_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C1_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C1_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C1_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C2) {
|
|
while(I2CMasterBusy(I2C2_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C2_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C2_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C2_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C2_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C2_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C3) {
|
|
while(I2CMasterBusy(I2C3_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C3_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C3_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C3_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C3_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C3_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C4) {
|
|
while(I2CMasterBusy(I2C4_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C4_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C4_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C4_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C4_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C4_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C5) {
|
|
while(I2CMasterBusy(I2C5_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C5_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C5_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C5_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C5_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C5_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C6) {
|
|
while(I2CMasterBusy(I2C6_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C6_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C6_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C6_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C6_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C6_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
if (I2cId == MCU_BSP_I2C7) {
|
|
while(I2CMasterBusy(I2C7_BASE)){
|
|
|
|
}
|
|
if (gMcuBspI2cObj[I2cId].I2cMode == MCU_BSP_I2C_MASTER) {
|
|
I2CMasterDisable(I2C7_BASE);
|
|
} else {
|
|
I2CSlaveDisable(I2C7_BASE);
|
|
}
|
|
if (I2cMode == MCU_BSP_I2C_MASTER) {
|
|
if (I2cSpeed == MCU_BSP_I2C_SPEED100000) {
|
|
I2CMasterInitExpClk(I2C7_BASE, SysFreqGet(), false);
|
|
} else {
|
|
I2CMasterInitExpClk(I2C7_BASE, SysFreqGet(), true);
|
|
}
|
|
} else {
|
|
I2CSlaveInit(I2C7_BASE, SlaveAddress);
|
|
}
|
|
}
|
|
gMcuBspI2cObj[I2cId].I2cMode = I2cMode;
|
|
gMcuBspI2cObj[I2cId].SlaveAddress = SlaveAddress;
|
|
gMcuBspI2cObj[I2cId].I2cSpeed = I2cSpeed;
|
|
gMcuBspI2cObj[I2cId].Enable = MCU_BSP_I2C_ON;
|
|
return 0;
|
|
}
|