PASII/CandeII_1.4/Driver/i2c.c

196 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "i2c.h"
#include "gpio.h"
#include <string.h>
//寄存器地址定义
static I2C_CTRL_TYPE * I2C_0_CTRL = ((I2C_CTRL_TYPE *) I2C_0_CTRL_BASE);
static I2C_TXD_TYPE * I2C_0_TXD = ((I2C_TXD_TYPE *) I2C_0_TXD_BASE);
static I2C_RXD_TYPE * I2C_0_RXD = ((I2C_RXD_TYPE *) I2C_0_RXD_BASE);
static I2C_CTRL_TYPE * I2C_1_CTRL = ((I2C_CTRL_TYPE *) I2C_1_CTRL_BASE);
static I2C_TXD_TYPE * I2C_1_TXD = ((I2C_TXD_TYPE *) I2C_1_TXD_BASE);
static I2C_RXD_TYPE * I2C_1_RXD = ((I2C_RXD_TYPE *) I2C_1_RXD_BASE);
/*****************************************************************************
para:
i2c : I2C0 or I2C1
return : void
*****************************************************************************/
void i2c_Init(uint8_t i2c,uint32_t clk_io,uint32_t sda_io)
{
if(i2c == I2C0)
{
PIN_Set_GPIO(sda_io,PIN_SEL_GPIO);
PIN_Pullup_Enable(T_QFN_48, sda_io);
PIN_Set_GPIO(clk_io,PIN_SEL_I2C_SCL0);
PIN_Set_GPIO(sda_io,PIN_SEL_I2C_SDA0);
I2C_0_CTRL->SLAVE_NACK = 0; // 1:NACK, 0:ACK
I2C_0_CTRL->SPEED = 79; //IIC clk = MCU CLK/(2*(speed+1)) SPEED默认值是64
}
else if(i2c == I2C1)
{
PIN_Set_GPIO(sda_io,PIN_SEL_GPIO);
PIN_Pullup_Enable(T_QFN_48, sda_io);
PIN_Set_GPIO(clk_io,PIN_SEL_I2C_SCL1);
PIN_Set_GPIO(sda_io,PIN_SEL_I2C_SDA1);
I2C_1_CTRL->SLAVE_NACK = 0; // 1:NACK, 0:ACK
I2C_1_CTRL->SPEED = 79; //IIC clk = MCU CLK/(2*(speed+1)) SPEED默认值是64
}
}
/***************************************************************************************************
para:
uint8_t id: 7位设备地址
uint8_t addr_len: 设备内部存储地址的长度I2C_2_BYTE_ADDRESS(2字节)I2C_1_BYTE_ADDRESS(1字节)
uint8_t * buf: 要发的数据内容
uint16_t sz: 要发送的数据长度
return : SUCCESS or ERROR
***************************************************************************************************/
ErrorStatus i2c_0_write(uint8_t id, uint8_t addr_len, uint16_t addr, uint8_t * buf, uint16_t sz)
{
ErrorStatus bret = SUCCESS;
I2C_0_CTRL->RSTB = 1;
I2C_0_CTRL->ID = id;
I2C_0_CTRL->ADDR_1 = addr_len;
I2C_0_CTRL->ADDRESS = addr;
I2C_0_CTRL->DATA_CNT = (sz - 1);
memcpy((uint8_t *)I2C_0_TXD->TX, buf ,sz);
I2C_0_CTRL->WRITE = 1;
while(I2C_0_CTRL->DONE_FLG == 0);
I2C_0_CTRL->DONE_FLG = 0;
if(I2C_0_CTRL->ERR_FLG==1)
{
I2C_0_CTRL->ERR_FLG = 0;
bret = ERROR;
}
I2C_0_CTRL->RSTB = 0; //reset
return bret;
}
/***************************************************************************************************
para:
uint8_t id: 7位设备地址
uint8_t addr_len: 设备内部存储地址的长度I2C_2_BYTE_ADDRESS(2字节)I2C_1_BYTE_ADDRESS(1字节)
uint8_t * buf: 读取数据的储存区域
uint16_t sz: 要读取的数据长度
return : SUCCESS or ERROR
***************************************************************************************************/
ErrorStatus i2c_0_read(uint8_t id, uint8_t addr_len, uint16_t addr, uint8_t * buf, uint16_t sz)
{
ErrorStatus bret = SUCCESS;
I2C_0_CTRL->RSTB=1;
I2C_0_CTRL->ID = id;
I2C_0_CTRL->ADDR_1 = addr_len;
I2C_0_CTRL->ADDRESS = addr;
I2C_0_CTRL->DATA_CNT = (sz - 1);
I2C_0_CTRL->READ=1;
while(I2C_0_CTRL->DONE_FLG == 0);
I2C_0_CTRL->DONE_FLG = 0;
if(I2C_0_CTRL->ERR_FLG == 1)
{
I2C_0_CTRL->ERR_FLG = 0;
bret = ERROR;
}
else
{
memcpy(buf, (uint8_t *)I2C_0_RXD->RX, sz);
}
I2C_0_CTRL->RSTB = 0; //reset
return bret;
}
/***************************************************************************************************
para:
uint8_t id: 7位设备地址
uint8_t addr_len: 设备内部存储地址的长度I2C_2_BYTE_ADDRESS(2字节)I2C_1_BYTE_ADDRESS(1字节)
uint8_t * buf: 要发的数据内容
uint16_t sz: 要发送的数据长度
return : SUCCESS or ERROR
***************************************************************************************************/
ErrorStatus i2c_1_write(uint8_t id, uint8_t addr_len, uint16_t addr, uint8_t * buf, uint16_t sz)
{
ErrorStatus bret = SUCCESS;
I2C_1_CTRL->RSTB = 1;
I2C_1_CTRL->ID = id;
I2C_1_CTRL->ADDR_1 = addr_len;
I2C_1_CTRL->ADDRESS = addr;
I2C_1_CTRL->DATA_CNT = (sz - 1);
memcpy((uint8_t *)I2C_1_TXD->TX, buf ,sz);
I2C_1_CTRL->WRITE=1;
while(I2C_1_CTRL->DONE_FLG == 0);
I2C_1_CTRL->DONE_FLG = 0;
if(I2C_1_CTRL->ERR_FLG==1)
{
I2C_1_CTRL->ERR_FLG = 0;
bret = ERROR;
}
I2C_1_CTRL->RSTB=0; //reset
return bret;
}
/***************************************************************************************************
para:
uint8_t id: 7位设备地址
uint8_t addr_len: 设备内部存储地址的长度I2C_2_BYTE_ADDRESS(2字节)I2C_1_BYTE_ADDRESS(1字节)
uint8_t * buf: 读取数据的储存区域
uint16_t sz: 要读取的数据长度
return : SUCCESS or ERROR
***************************************************************************************************/
ErrorStatus i2c_1_read(uint8_t id, uint8_t addr_len, uint16_t addr, uint8_t * buf, uint16_t sz)
{
ErrorStatus bret = SUCCESS;
I2C_1_CTRL->RSTB=1;
I2C_1_CTRL->ID = id;
I2C_1_CTRL->ADDR_1 = addr_len;
I2C_1_CTRL->ADDRESS = addr;
I2C_1_CTRL->DATA_CNT = (sz - 1);
I2C_1_CTRL->READ=1;
while(I2C_1_CTRL->DONE_FLG == 0);
I2C_1_CTRL->DONE_FLG = 0;
if(I2C_1_CTRL->ERR_FLG == 1)
{
I2C_1_CTRL->ERR_FLG = 0;
bret = ERROR;
}
else
{
memcpy(buf, (uint8_t *)I2C_1_RXD->RX, sz);
}
I2C_1_CTRL->RSTB = 0; //reset
return bret;
}