20240909-DXSPX-emb/RTCGet(可以跑的版本)/Src/Usr/BSP/usr_bsp_i2c.c
2024-09-11 17:03:46 +08:00

309 lines
11 KiB
C
Raw Permalink Blame History

#include "usr_bsp_i2c.h"
#include <cpu.h>
#include <os.h>
#include <bsp_int.h>
#include <bsp_sys.h>
#include <lib_def.h>
#include <os_cpu.h>
#include "usr_bsp_sys.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "inc/hw_memmap.h"
#include "inc/hw_i2c.h"
#include "inc/hw_ints.h"
int8_t usr_bsp_i2c_init(uint8_t i2c_id, int32_t i2c_speed, uint8_t i2c_mode, uint8_t slave_address)
{
if (i2c_mode == USR_I2C_MASTER) {
switch (i2c_id) {
case USR_I2C_NUM0:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
if (i2c_speed == USR_I2C_SPEED400000) {
I2CMasterInitExpClk ( I2C0_BASE, usr_bsp_get_sysclock(), true );
} else if (i2c_speed == USR_I2C_SPEED100000) {
I2CMasterInitExpClk ( I2C0_BASE, usr_bsp_get_sysclock(), false );
} else {
return -1;
}
break;
case USR_I2C_NUM1:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOG);
GPIOPinConfigure(GPIO_PG0_I2C1SCL);
GPIOPinConfigure(GPIO_PG1_I2C1SDA);
GPIOPinTypeI2CSCL(GPIO_PORTG_BASE, GPIO_PIN_0);
GPIOPinTypeI2C(GPIO_PORTG_BASE, GPIO_PIN_1);
if (i2c_speed == USR_I2C_SPEED400000) {
I2CMasterInitExpClk ( I2C1_BASE, usr_bsp_get_sysclock(), true );
} else if (i2c_speed == USR_I2C_SPEED100000) {
I2CMasterInitExpClk ( I2C1_BASE, usr_bsp_get_sysclock(), false );
} else {
return -1;
}
break;
}
return 0;
} else if (i2c_mode == USR_I2C_SLAVE) {
switch (i2c_id) {
case USR_I2C_NUM0:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
I2CSlaveInit(I2C0_BASE, slave_address);
break;
case USR_I2C_NUM1:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOG);
GPIOPinConfigure(GPIO_PG0_I2C1SCL);
GPIOPinConfigure(GPIO_PG1_I2C1SDA);
GPIOPinTypeI2CSCL(GPIO_PORTG_BASE, GPIO_PIN_0);
GPIOPinTypeI2C(GPIO_PORTG_BASE, GPIO_PIN_1);
I2CSlaveInit(I2C1_BASE, slave_address);
break;
}
return 0;
} else {
return -1;
}
}
int8_t usr_bsp_i2c_matser_senddata(uint8_t i2c_id, uint8_t slave_address,
uint8_t *send_data, uint32_t send_len)
{
uint32_t i;
CPU_SR_ALLOC();
OS_ENTER_CRITICAL();
if (send_len < 1) {
OS_EXIT_CRITICAL();
return -1;
}
if (i2c_id == USR_I2C_NUM0) {
while(I2CMasterBusy(I2C0_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
I2CMasterSlaveAddrSet(I2C0_BASE, slave_address, false);
if (send_len == 1) {
I2CMasterDataPut(I2C0_BASE, *send_data);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C0_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
OS_EXIT_CRITICAL();
return 0;
}
for (i = 0; i < send_len; i++) {
if (i == 0) {
I2CMasterDataPut(I2C0_BASE, send_data[i]);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
} else if (i == send_len - 1) {
I2CMasterDataPut(I2C0_BASE, send_data[i]);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
} else {
I2CMasterDataPut(I2C0_BASE, send_data[i]);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
}
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
if (i != send_len - 1) {
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C0_BASE)) != I2C_MCS_ARBLST) {
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
}
}
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C0_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
} else if (i2c_id == USR_I2C_NUM1) {
while(I2CMasterBusy(I2C1_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
I2CMasterSlaveAddrSet(I2C1_BASE, slave_address, false);
if (send_len == 1) {
I2CMasterDataPut(I2C1_BASE, *send_data);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C1_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
OS_EXIT_CRITICAL();
return 0;
}
for (i = 0; i < send_len; i++) {
if (i == 0) {
I2CMasterDataPut(I2C1_BASE, send_data[i]);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
} else if (i == send_len - 1) {
I2CMasterDataPut(I2C1_BASE, send_data[i]);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
} else {
I2CMasterDataPut(I2C1_BASE, send_data[i]);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
}
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
OS_EXIT_CRITICAL();
return -1;
}
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
if (i != send_len - 1) {
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C1_BASE)) != I2C_MCS_ARBLST) {
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
}
}
OS_EXIT_CRITICAL();
return -1;
}
while (I2CMasterBusy(I2C1_BASE)) {
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
} else {
OS_EXIT_CRITICAL();
return -1;
}
OS_EXIT_CRITICAL();
return 0;
}
int8_t usr_bsp_i2c_matser_recvdata(uint8_t i2c_id, uint8_t slave_address,
uint8_t *recv_data, uint32_t recv_len)
{
uint32_t i;
CPU_SR_ALLOC();
OS_ENTER_CRITICAL();
if (recv_len < 1) {
OS_EXIT_CRITICAL();
return -1;
}
if (i2c_id == USR_I2C_NUM0) {
while(I2CMasterBusy(I2C0_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
I2CMasterSlaveAddrSet(I2C0_BASE, slave_address, true);
if (recv_len == 1) {
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C0_BASE)) {
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C0_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
*recv_data = I2CMasterDataGet(I2C0_BASE);
OS_EXIT_CRITICAL();
return 0;
}
for (i = 0; i < recv_len; i++) {
if (i == 0) {
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
} else if (i == recv_len - 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 != recv_len - 1) {
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C0_BASE)) != I2C_MCS_ARBLST) {
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
}
}
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C0_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
recv_data[i] = I2CMasterDataGet(I2C0_BASE);
}
} else if (i2c_id == USR_I2C_NUM1) {
while(I2CMasterBusy(I2C1_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
I2CMasterSlaveAddrSet(I2C1_BASE, slave_address, true);
if (recv_len == 1) {
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
if (I2C_MASTER_ERR_NONE != I2CMasterErr(I2C1_BASE)) {
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C1_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
*recv_data = I2CMasterDataGet(I2C1_BASE);
OS_EXIT_CRITICAL();
return 0;
}
for (i = 0; i < recv_len; i++) {
if (i == 0) {
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
} else if (i == recv_len - 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 != recv_len - 1) {
if ((I2C_MCS_ARBLST & I2CMasterErr(I2C1_BASE)) != I2C_MCS_ARBLST) {
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
}
}
OS_EXIT_CRITICAL();
return -1;
}
while(I2CMasterBusy(I2C1_BASE)){
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
}
recv_data[i] = I2CMasterDataGet(I2C1_BASE);
}
} else {
OS_EXIT_CRITICAL();
return -1;
}
OS_EXIT_CRITICAL();
return 0;
}
int8_t usr_bsp_i2c_slave_recvdata(uint8_t i2c_id, uint8_t *recv_data, uint32_t recv_len)
{
return 0;
}
int8_t usr_bsp_i2c_slave_senddata(uint8_t i2c_id, uint8_t *send_data, uint32_t send_len)
{
return 0;
}