?? i2cint.c
字號:
/*
---------------------------------------------------------------------------------------------------------
*********************************************************************************************************
** 文件名稱 : I2CINT.c
** 功能說明 : Luminary硬件I2C中斷方式軟件包。
** 使用說明 : 主程序要配置好I2C總線接口(I2C引腳功能和I2C中斷,并已使能I2C主模式)
*********************************************************************************************************
---------------------------------------------------------------------------------------------------------
*/
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_i2c.h"
#include "gpio.h"
#include "sysctl.h"
#include "i2c.h"
#include "interrupt.h"
#define uchar unsigned char
#define ulong unsigned long
/*******************************************************************************************
** 中斷中的狀態
*******************************************************************************************/
#define STATE_IDLE 0 /* 總線空閑狀態 */
#define STATE_WRITE_ONE 1 /* 寫單個字節狀態 */
#define STATE_WRITE_NEXT 2 /* 寫下一個字節狀態 */
#define STATE_WRITE_FINAL 3 /* 寫最后一個字節狀態 */
#define STATE_READ_ONE 4 /* 讀單個字節狀態 */
#define STATE_READ_FIRST 5 /* 讀第一個字節狀態 */
#define STATE_READ_NEXT 6 /* 讀下一個字節狀態 */
#define STATE_READ_FINAL 7 /* 讀最后一個字節狀態 */
#define STATE_READ_WAIT 8 /* 讀字節等待狀態 */
/*******************************************************************************************
** 全局變量定義
*******************************************************************************************/
static volatile uchar I2C_sla; /* I2C器件從地址 */
static volatile ulong I2C_suba; /* I2C器件內部子地址 */
static volatile uchar I2C_suba_num; /* I2C子地址字節數 */
static volatile uchar *I2C_buf; /* 數據緩沖區指針 */
static volatile ulong I2C_num; /* 要讀取/寫入的數據個數 */
static volatile uchar I2C_opt; /* I2c讀寫操作,0為讀操作,1為寫操作 */
static volatile uchar I2C_state = STATE_IDLE; /* 中斷服務程序的當前狀態 */
/*
******************************************************************************************
** 函數名稱: Delays()
** 函數功能: 延時
** 入口參數: dly
** 出口參數: 無
******************************************************************************************
*/
void Delays (ulong dly)
{
int i,j;
for (; dly>0; dly--)
{
for (i=0; i<150; i++)
for (j=0; j<255; j++);
}
}
/*
*********************************************************************************************************
** 函數名稱:I2CInit()
** 函數功能:I2C接口初始化。
** 入口參數:spd 總線速度100K(參數值為100000)或400K(參數值為4000000)
** pri 中斷優先級0~7
** 出口參數:返回值為false時表示操作出錯,為true時表示操作正確。
** 說明:
*********************************************************************************************************
*/
int I2CInit(ulong spd, uchar pri)
{
if ((spd == 400000) || (spd == 100000))
{
// 使能所使用的外設
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
// 配置相關引腳,以進行I2C操作
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
// 初始化I2C主機,設置主機為低速.
if(spd == 400000)
I2CMasterInit(I2C_MASTER_BASE, true);
else
I2CMasterInit(I2C_MASTER_BASE, false);
// 使能處理器中斷
IntMasterEnable();
// 使能I2C中斷
IntEnable(INT_I2C);
// 使能I2C主機中斷
I2CMasterIntEnable(I2C_MASTER_BASE);
// 設置I2C中斷的優先級
IntPrioritySet(INT_I2C, (pri << 5));
return(true);
}
else
return(false);
}
/*
*********************************************************************************************************
** 函數名稱:ISendByte()
** 函數功能:向無子地址器件發送1字節數據。
** 入口參數:sla 器件地址
** c 要發送的數據
** 出口參數:返回值為false時表示操作出錯,為true時表示操作正確。
** 說明: 使用前要初始化好I2C引腳功能和I2C中斷,并已使能I2C主模式
*********************************************************************************************************
*/
int ISendByte(uchar sla, uchar c)
{
I2C_sla = sla >> 1;
I2C_buf = &c;
I2C_state = STATE_WRITE_ONE;
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, false); // 主機寫操作
I2CMasterDataPut(I2C_MASTER_BASE, *I2C_buf); // 寫一個數據
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND); // 啟動單次發送
while(I2C_state != STATE_IDLE);
if(true == I2CMasterBusy(I2C_MASTER_BASE))
return (false);
else
return (true);
}
/*
*********************************************************************************************************
** 函數名稱 :ISendStr()
** 函數功能 :向有子地址器件任意地址開始寫入N字節數據
** 入口參數 : sla 器件從地址
** suba_type 子地址結構 0-8+X結構 1-單字節地址 2-雙字節地址 3-三字節地址
** suba 器件子地址
** s 數據發送緩沖區指針
** no 寫入的個數
** 出口參數 : TRUE 操作成功
** FALSE 操作失敗
*********************************************************************************************************
*/
int ISendStr(uchar sla, ulong suba, uchar sub_type, uchar *s, ulong no)
{
I2C_sla = sla >> 1;
I2C_buf = s;
I2C_num = no;
I2C_suba = suba;
switch(sub_type)
{
// 子地址為“8+x”類型
case 0:
I2C_sla = I2C_sla | ((suba >> 8) & 0x07);
I2C_suba_num = 1;
break;
// 子地址為1個字節
case 1:
I2C_suba_num = 1;
break;
// 子地址為2個字節
case 2:
I2C_suba_num = 2;
break;
// 子地址為3個字節
case 3:
I2C_suba_num = 3;
break;
default: break;
}
if((no == 1) && (I2C_suba_num == 1))
I2C_state = STATE_WRITE_FINAL; // 單字節地址或8+x結構地址發送1個字節數據
else
I2C_state = STATE_WRITE_NEXT; // 多字節地址或發送多個字節數據
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, false); // 主機寫操作
I2C_suba_num--;
I2CMasterDataPut(I2C_MASTER_BASE,
(I2C_suba >> (8 * I2C_suba_num))); // 寫子地址高字節
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);// 突發寫操作啟動
while(I2C_state != STATE_IDLE);
if(true == I2CMasterBusy(I2C_MASTER_BASE))
return (false);
else
return (true);
}
/*
*********************************************************************************************************
** 函數名稱:ISendStrExt()
** 函數功能:向無子地址器件發送多字節數據。
** 入口參數:sla 器件地址
** s 要發送的數據
** no 發送的字節個數
** 出口參數:返回值為false時表示操作出錯,為true時表示操作正確。
** 說明: 發送數據字節至少2個字節
*********************************************************************************************************
*/
int ISendStrExt(uchar sla, uchar *s, uchar no)
{
I2C_sla = sla >> 1;
I2C_buf = s;
I2C_num = no;
if (no > 1) // 發送的字節參數過濾
{
if(no == 2)
I2C_state = STATE_WRITE_FINAL;
else
I2C_state = STATE_WRITE_NEXT;
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, false); // 主機寫操作
I2CMasterDataPut(I2C_MASTER_BASE, *I2C_buf++);
I2C_num--;
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);// 突發寫操作啟動
while(I2C_state != STATE_IDLE);
if(true == I2CMasterBusy(I2C_MASTER_BASE))
return (false);
else
return (true);
}
else
return(false);
}
/*
*********************************************************************************************************
** 函數名稱:IRcvByte()
** 函數功能:向無子地址器件讀取1字節數據。
** 入口參數:sla 器件地址
** c 接收數據的變量指針
** 出口參數:返回值為false時表示操作出錯,為true時表示操作正確。
** 說明: 使用前要初始化好I2C引腳功能和I2C中斷,并已使能I2C主模式
*********************************************************************************************************
*/
int IRcvByte(uchar sla, uchar *c)
{
I2C_sla = sla >> 1;
I2C_buf = c;
I2C_state = STATE_READ_WAIT;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -