?? i2c.c
字號:
I2C_n = n; //I2C接口號
if(n == 0) //設置I2C0接口
{
PINSEL0 = (PINSEL0 &(~0x0f0))|0x50; //設置I2C0管腳有效
// SetISR(9,slot,(uint32)IRQ_I2C); //設置I2C0中斷
VICIntSelect = 0x00000000; /* 設置所有通道為IRQ中斷 */
VICVectCntl0 = (0x20 | 0x09); /* I2C通道分配最高優先級 */
VICVectAddr0 = (int32)IRQ_I2C; /* 設置I2C中斷向量 */
VICIntEnable = 1 << 9; /* 使能I2C中斷 */
}
else //設置I2C1接口的引腳和中斷
{
PINSEL1 = (PINSEL1 &(~(0x0f<<2)))|(0x01<<2)|(0x01<<4); //設置I2C1管腳有效
//SetISR(19,slot,(uint32)IRQ_I2C); //設置I2C1中斷
VICIntSelect = 0x00000000; /* 設置所有通道為IRQ中斷 */
VICVectCntl0 = (0x20 | 0x19); /* I2C通道分配最高優先級 */
VICVectAddr0 = (int32)IRQ_I2C; /* 設置I2C中斷向量 */
VICIntEnable = 1 << 19;
}
if(MODE == 1) //I2C設置為主模式
{
if(I2C_n == 0)
{
I2C0SCLH = (Fpclk*5/Fi2c)/2; //設定I2C時鐘
I2C0SCLL = (Fpclk*5/Fi2c)/2;
I2C0CONCLR = 0x2c;
I2C0CONSET = 0x40; //使能主I2C
}
else
{
I2C1SCLH = (Fpclk*5/Fi2c)/2; //設定I2C時鐘
I2C1SCLL = (Fpclk*5/Fi2c)/2;
I2C1CONCLR = 0x2c;
I2C1CONSET = 0x40; //使能主I2C
}
}
else //I2C設置為從模式
{
*((volatile uint32 *)(&I2ADR) + (I2C_n*0x10000)) = Adr&0xfe; //設置從機地址
*((volatile uint32 *)(&I2C0CONSET) + (I2C_n*0x10000)) = 0x44; //使能從I2C
*((volatile uint32 *)(&I2C0CONCLR) + (I2C_n*0x10000)) = 0x28;
}
// IRQEnable(); //打開IRQ中斷
return(1);
}
/*********************************************************************************************************
**函數名稱:uint8 I2C_SendByte(uint8 n,uint8 sla,uint8 dat)
**函數功能:向無子地址器件發送1字節數據
**入口參數:n 接口號0,1
** sla 器件地址
** dat 要發送的數據
**出口參數:返回值為0時表示出錯,為1時表示操作正確
**說明:使用前要初始化好I2C引腳功能和I2C中斷,并已使能I2C主模式,程序死等待操作完成
********************************************************************************************************/
uint8 I2C_SendByte(uint8 n,uint8 sla,uint8 dat)
{
if((n!=0)&&(n!=1)) return(0);
/*參數設置*/
I2C_n = n; //I2C接口號
I2C_sla = sla; //寫操作的器件地址
I2C_buf = &dat; //待發送的數據
I2C_num = 1; //發送1字節數據
I2C_suba_en = 0; //無子地址
I2C_end = 0;
*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x2c;
*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x60; //設置為主機,并啟動總線
while(I2C_end == 0);
if(I2C_end == 1) return(1);
else return(0);
}
/*********************************************************************************************************
**函數名稱:uint8 I2C_RcvByte(uint8 n,uint8 sla,uint8 *dat)
**函數功能:向無子地址器件讀取1字節數據
**入口參數:n 接口號0,1
** sla 器件地址
** dat 接受數據的指針變量
**出口參數:返回值為0時表示出錯,為1時表示操作正確
**說明:使用前要初始化好I2C引腳功能和I2C中斷,并已使能I2C主模式,程序死等待操作完成
********************************************************************************************************/
uint8 I2C_RcvByte(uint8 n,uint8 sla,uint8 *dat)
{
if((n!=0)&&(n!=1)) return(0);
/*參數設置*/
I2C_n = n; //I2C接口號
I2C_sla = sla+1; //讀操作的器件地址
I2C_buf = dat;
I2C_num = 1; //讀取字節數為1
I2C_suba_en = 0; //無子地址
I2C_end = 0;
*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x2c;
*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x60; //設置為主機,并啟動總線
while(I2C_end == 0);
if(I2C_end == 1) return(1);
else return(0);
}
/*********************************************************************************************************
**函數名稱:uint8 I2C_ReadNByte(uint8 n,uint8 sla,uint32 suba_type,uint32 suba,uint8 *s,uint32 num)
**函數功能:從有子地址器件任意地址開始讀取N字節數據
**入口參數:n 接口號0,1
** sla 器件從地址
** suba_type 子地址結構 1-單字節地址,2-雙字節地址,3-8+X結構
** suba 器件子地址
** *s 數據接收緩沖區指針
** num 讀取的個數
**出口參數:1 操作成功
** 0 操作失敗
**說明:程序死等待操作完成
********************************************************************************************************/
uint8 I2C_ReadNByte(uint8 n,uint8 sla,uint32 suba_type,uint32 suba,uint8 *s,uint32 num)
{
if((n!=0)&&(n!=1)) return(0);
I2C_n = n; //I2C接口號
if(num > 0) /*判斷num個數的格式*/
{
/*參數設置*/
if(suba_type == 1)
{
/*子地址為單字節*/
I2C_sla = sla + 1; //讀器件的從地址,R=1
I2C_suba = suba; //器件子地址
I2C_suba_num = 1; //器件子地址為1字節
}
if(suba_type == 2)
{
/*子地址為2字節*/
I2C_sla = sla + 1; //讀器件的從地址,R=1
I2C_suba = suba; //器件子地址
I2C_suba_num = 2; //器件子地址為2字節
}
if(suba_type == 3)
{
/*子地址結構為8+X*/ //如24C04/08/16的從地址中含有A8,A9,A10
I2C_sla = sla + ((suba>>7) & 0x0e) + 1; //讀器件的從地址,R=1
I2C_suba = suba & 0x0ff; //器件子地址
I2C_suba_num = 1; //器件子地址為8+X
}
I2C_buf = s; //數據接收緩沖區指針
I2C_num = num; //要讀取的個數
I2C_suba_en = 1; //有子地址讀
I2C_end = 0; //
/*清除STA,SI,AA標志位*/
*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = (1<<2)| //AA
(1<<3)| //SI
(1<<5); //STA
/*置位STA,啟動I2C總線*/
*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = (1<<5)| //STA
(1<<6); //I2CEN
/*等待I2C操作完成*/
while(I2C_end == 0);
if(I2C_end == 1) return(1);
else return(0);
}
return(0);
}
/*********************************************************************************************************
**函數名稱:uint8 I2C_WriteNByte(uint8 n,uint8 sla,uint8 suba_type,uint32 suba,uint8 *s,uint32 num)
**函數功能:向有子地址器件寫入N字節數據
**入口參數:n 接口號0,1
** sla 器件從地址
** suba_type 子地址結構 1-單字節地址,2-雙字節地址,3-8+X結構
** suba 器件子地址
** *s 數據發送緩沖區指針
** num 要寫入的數據的個數
**出口參數:1 操作成功
** 0 操作失敗
**說明:程序死等待操作完成
********************************************************************************************************/
uint8 I2C_WriteNByte(uint8 n,uint8 sla,uint8 suba_type,uint32 suba,uint8 *s,uint32 num)
{
if((n!=0)&&(n!=1)) return(0);
I2C_n = n; //I2C接口號
/*參數設置*/
if(num > 0) /*判斷num個數的格式*/
{
if(suba_type == 1)
{
/*子地址為單字節*/
I2C_sla = sla; //寫器件的從地址
I2C_suba = suba; //器件子地址
I2C_suba_num = 1; //器件子地址為1字節
}
if(suba_type == 2)
{
/*子地址為2字節*/
I2C_sla = sla; //寫器件的從地址
I2C_suba = suba; //器件子地址
I2C_suba_num = 2; //器件子地址為2字節
}
if(suba_type == 3)
{
/*子地址結構為8+X*/
I2C_sla = sla + ((suba>>7) & 0x0e) ; //寫器件的從地址
I2C_suba = suba & 0x0ff; //器件子地址
I2C_suba_num = 1; //器件子地址為8+X
}
I2C_buf = s; //數據發送緩沖區指針
I2C_num = num; //要發送的數據的個數
I2C_suba_en = 2; //有子地址,寫操作
I2C_end = 0; //
/*清除STA,SI,AA標志位*/
*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = (1<<2)| //AA
(1<<3)| //SI
(1<<5); //STA
/*置位STA,啟動I2C總線*/
*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = (1<<5)| //STA
(1<<6); //I2CEN
/*等待I2C操作完成*/
while(I2C_end == 0);
if(I2C_end == 1) return(1);
else return(0);
}
return(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -