309 lines
11 KiB
C
309 lines
11 KiB
C
|
|
#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;
|
|||
|
|
}
|