#include "usr_bsp_i2c.h" #include #include #include #include #include #include #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)){ //等待总线空闲 } 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)){ //等待发送完成 } 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)){ //等待发送完成 } } } else if (i2c_id == USR_I2C_NUM1) { while(I2CMasterBusy(I2C1_BASE)){ //等待总线空闲 } 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)){ //等待发送完成 } 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)) { //等待发送完成 } } } 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)){ //等待总线空闲 } 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)){ //等待总线空闲 } *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)){ //等待总线空闲 } recv_data[i] = I2CMasterDataGet(I2C0_BASE); } } else if (i2c_id == USR_I2C_NUM1) { while(I2CMasterBusy(I2C1_BASE)){ //等待总线空闲 } 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)){ //等待总线空闲 } *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)){ //等待总线空闲 } 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; }