?? msp430f169的i2c程序(僅供參考).c
字號:
MSP430F169的i2c程序(僅供參考)
/************************************************************
*文件名:msp430f169i2c.c
*整體描述:MSP430F169單片機硬件IIC軟件,字節方式,主方式
* IIC接口:P3.3=SCL,P3.1=SDA;(開漏輸出)
* 相應寄存器:地址寄存器 I2COA 用于存放自身從地址(從方式時才有用)
* 地址寄存器 I2CSA 用于存放外圍的從機地址(主方式時才有用)
* 控制寄存器 U0CTL 硬件I2C的設置、使能、模式等。
發送控制寄存器 I2CTCTL
* 數據控制寄存器 I2CDCTL 指示I2C總線的狀態
*
* U0CTL -- RXDMAEN,TXDMAEN,I2C, XA, LISREN,SYNC,MST,I2CEN
* 0 0 1 0 0 1 1 1 (0x17)
* I2CTCTL --I2CWORD,I2CRM,I2CSSEL1,I2XSSEL0, I2CTRX,I2CSTB, I2CSTP, I2CSTT
* 0 1 1 0 * 0 * *
* I2C從機AT24C512,注意從機讀寫地址的定義:(MSB) 1 0 1 0 0 A1 A0 R/W (LSB)
*作者: jy
*狀態: 通過
************************************************************/
#include <msp430x16x.h>
#include "fpgacode.h"
#define WR24C512
#define SDA_1 P3OUT |= BIT1 //串行數據線,SDA = 1
#define SDA_0 P3OUT &=~ BIT1 //SDA = 0
#define SCL_1 P3OUT |= BIT3 //串行時鐘線,SCL = 1
#define SCL_0 P3OUT &=~ BIT3 //SCL = 0
#define SDADIR_IN P3DIR &=~ BIT1 //SDA,I/O口為輸入
#define SDADIR_OUT P3DIR |= BIT1 //I/0口為輸出
#define SDA_IN ((P3IN >> 1) & 0x01) //Read SDA
#define SCLDIR_IN P3DIR &=~ BIT3 //SCL,I/O口為輸入
#define SCLDIR_OUT P3DIR |= BIT3 //I/0口為輸出
#define SCL_IN ((P3IN >> 3) & 0x01) //Read SCL
#ifdef WR24C512
static int numi = 0; //Data Pointer
#else
static int numj = 0; //Data Pointer
#endif
#define I2CSLA 0x50
/*--------------------------------------------------------
--功能描述: 檢查總線是否空閑
--子程序狀況: 09-23調試通過
----------------------------------------------------------
--*/
void I2c_Idle_Check(void)
{
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態:0,空閑;1:忙
}
/*--------------------------------------------------------
--功能描述: 延時
----------------------------------------------------------
--*/
void DelayTime10us(unsigned char n)
{
unsigned char i;
while(n--) // 5 cycles
for(i=0;i<10;i++); // 8mhz 110:771 + 4 to while
}
/*---------------------------------------------------------
--功能描述:發送數據:用于向總線發送數據
--子程序狀況: 09-23調試通過
-----------------------------------------------------------
--*/
void I2cBusSendByte(unsigned char c)
{
while((I2CIFG & TXRDYIFG) != TXRDYIFG); // 檢測發送準備
I2CDRB = c; // 寫發送寄存器
}
/*------------------ MSP430 I2C 寫數據 09-23調試通過---------------------*/
/*--------------------------------------------------------
--功能描述:申請總線:進行I2C總線的初始化-發送起始信號
--子程序狀況: 09-23調試通過
----------------------------------------------------------
--*/
void I2C_Send(unsigned char ndatNum)
{
// 注意:通訊結束,I2CMST 自動清零,再次通訊必須重新置位
P3OUT = 0x00; // clear P3 output register
P3SEL = 0x0A; // P3.1=SDA, P3.3=SCL,Select I2C pins, Setup I2C module
U0CTL |= (I2C + SYNC); // select I2C mode;XA=0,7bit_addresing;
U0CTL &= ~I2CEN; // i2c功能使能無效
// I2CTCTL = I2CRM + I2CSSEL_2; // x(x>256)字節模式 ,new start測試使用
// 選擇方式 I2CRM=0,最終用戶使用
I2CTCTL = I2CSSEL_2;
I2CNDAT = 2 + ndatNum; // 最終用戶使用,2byte地址 + 128byte數據
I2CPSC = 2; // set scl
I2CIFG = 0;
I2CSA = 0x50; // Sl××e address of At24c512
U0CTL |= I2CEN; // ena××e I2C module, 7 bit addr, master mode 08-26
U0CTL |= MST;
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態:0,空閑;1:忙
I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ; // I2CRM =0,啟動總線,發送從器件地址
while((I2CIFG & NACKIFG) == 0x02); // ack 為低電平,等待地址應答位 ,判斷 無應答NACKIFG = 1
}
/*----------------------------------------------------------------
--子程標號 :I2cWrSlaSubAddr
--子程功能 :主機發送從機的子地址
--入口參數 :unsigned char sla,unsigned int suba
--參數說明 :子地址
--子程序狀況 :09-23調試通過
--說明 :完成地址信息的定位,先確定順序讀寫的起始地址
-----------------------------------------------------------------
--*/
unsigned char I2cSendSubAddr(unsigned int suba,unsigned char ndatNum)
{
unsigned char Hi_suba,Lo_suba;
I2C_Send(ndatNum); // 啟動總線,等待地址應答位
Hi_suba = ( unsigned char )( suba >> 8 );
Lo_suba = ( unsigned char )( suba & 0x00ff );
I2cBusSendByte( Hi_suba ); //發送器件子地址
while((I2CIFG & 0x02) == NACKIFG ) // 等待數據的應答
{
I2CTCTL |= I2CSTP; // 無應答,結束總線
return(0);
}
I2cBusSendByte( Lo_suba ); //發送器件子地址
while((I2CIFG & 0x02 )==0x02 ) // 等待數據的應答
{
I2CTCTL |= I2CSTP; // 無應答,結束總線
return(0);
}
return(1);
}
/*------------------------------------------------------------------
--子程標號 :I2cWriteStr (用戶函數)
--子程功能 :向I2C從器件寫入數據
--入口參數 :unsigned char *ps,unsigned char num
--參數說明 :寫入數據的地址指針,數據個數
--子程序狀況 : 09-23調試通過
--說明 :I2C讀取數據
-------------------------------------------------------------------
--*/
unsigned char I2cSendStr(const unsigned char * ps,unsigned char num)
{
// unsigned char i;
unsigned char tempnum;
tempnum = num-1;
for(numi=0;numi<tempnum;numi++)
{
I2cBusSendByte(*ps);
while((I2CIFG & 0x02) == NACKIFG) // 等待數據的應答
{
I2CTCTL |= I2CSTP; // 無應答,結束總線
return(0);
}
ps++;
}
// I2CTCTL |= I2CSTP; //I2CRM =1模式中,在發送最后一個數據之前將停止位置位,*特別注意,必須
I2cBusSendByte(*ps);
while((I2CIFG & 0x02) == NACKIFG) // 等待數據的應答
{
I2CTCTL |= I2CSTP; // 無應答,結束總線
return(0);
}
return(1);
}
//------------------寫at24c512----
void I2cWrAt24c512(void)
{
unsigned int j=0;
unsigned char m,n;
unsigned int tempAddr;
for (j = 0;j <462;j++) // page write
{
tempAddr = 128*j;
while (I2CBUSY & I2CDCTL); // I2C ready?
I2cSendSubAddr(tempAddr,0x80);
I2cSendStr(FPGACfg+tempAddr,0x80);
P4OUT ^= 0x80;
for (m=0;m<125;m++) {for (n=0;n<110;n++);}
P4OUT ^= 0x80;
}
tempAddr = 128*j;
while (I2CBUSY & I2CDCTL); // I2C ready?
I2cSendSubAddr(tempAddr,0x4f);
I2cSendStr(FPGACfg+tempAddr,0x4f);
P4OUT ^= 0x80;
for (m=0;m<125;m++) {for (n=0;n<110;n++);}
P4OUT ^= 0x80;
}
/*-------------------------- MSP430 I2C 讀取數據-----------------------------*/
/*---------------------------------------------------------------------
--子程標號 :I2cSlaSubAddr
--子程功能 :主器件發送從機器件地址和子地址
--入口參數 :unsigned int suba
--參數說明 :子地址
--子程調用 :I2cBusSendByte
--子程序狀況 :Y
--說明 :完成地址信息的定位,先確定順序讀寫的起始地址
---------------------------------------------------------------------
--*/
void I2cReceSubAddr(unsigned int suba) // test 09-25 讀之前先寫地址
{
unsigned char Hi_suba,Lo_suba;
P3OUT = 0x00; // clear P3 output register
P3SEL = 0x0A; // P3.1=SDA, P3.3=SCL,Select I2C pins, Setup I2C module
U0CTL |= I2C + SYNC; // select I2C mode;XA=0,7bit_addresing;
U0CTL &= ~I2CEN; // i2c功能使能無效
I2CTCTL = I2CSSEL_2; // I2CRM = 0,
I2CNDAT = 2; // I2CRM = 0,2byte地址 + 128byte數據,固定字節
I2CIFG = 0;
I2CPSC = 1; // set scl
I2CSA = 0x50; // Sl××e address of At24c512
U0CTL |= I2CEN; // ena××e I2C module, 7 bit addr, master mode 08-26
U0CTL |= MST;
Hi_suba = ( unsigned char )( suba >> 8 );
Lo_suba = ( unsigned char )( suba & 0x00ff );
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態:0,空閑;1:忙
I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ; // I2CRM =0,啟動總線,發送從器件地址
while((I2CIFG & NACKIFG) == 0x02) // ack 為低電平,等待地址應答位 ,判斷 無應答NACKIFG = 1
{
I2CTCTL |= I2CSTP; // 結束總線
}
I2cBusSendByte( Hi_suba ); //發送器件子地址
while((I2CIFG & NACKIFG) == 0x02) // ack 為低電平,等待地址應答位 ,判斷 無應答NACKIFG = 1
{
I2CTCTL |= I2CSTP; // 結束總線
}
I2cBusSendByte( Lo_suba ); //發送器件子地址
while((I2CIFG & NACKIFG) == 0x02) // ack 為低電平,等待地址應答位 ,判斷 無應答NACKIFG = 1
{
I2CTCTL |= I2CSTP; // 結束總線
}
DelayTime10us(250);
DelayTime10us(250);
DelayTime10us(250);
DelayTime10us(250);
}
/*---------------------------------------------------------------------
--子程標號 :I2cSlaSubAddr
--子程功能 :主器件接收初始化
--入口參數 :無
---------------------------------------------------------------------
--*/
void InitI2cRece(unsigned char num)
{
P3OUT = 0x00; // clear P3 output register
P3SEL = 0x0A; // P3.1=SDA, P3.3=SCL,Select I2C pins, Setup I2C module
U0CTL |= I2C + SYNC; // select I2C mode;XA=0,7bit_addresing;
U0CTL &= ~I2CEN; // i2c功能使能無效
// I2CTCTL = I2CRM + I2CSSEL_2; // I2CRM=1 x(x>256)字節模式
I2CTCTL = I2CSSEL_2; // I2CRM=0
I2CNDAT = num; // 1個字節
I2CPSC = 1; // set scl
I2CIFG = 0;
I2CSA = 0x50; // Sl××e address of At24c512
I2CTCTL &= ~I2CTRX;
U0CTL |= I2CEN; // ena××e I2C module, 7 bit addr, master mode 08-26
}
/*---------------------------------------------------------------
--功能描述 : 讀一個字節
--子程序狀況 :
------------------------------------------------------------------
--*/
unsigned char I2cReceSlaByte(void)
{
unsigned char ch;
DelayTime10us(15);
U0CTL |= MST; //主模式
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態:0,空閑;1:忙
I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST, SP (clears MST)
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // 等待地址應答位 ,判斷
ch = I2CDRB;
return(ch);
}
/*---------------------------------------------------------------
--功能描述 : 連續讀數據
--子程序狀況 :
------------------------------------------------------------------
--*/
void I2cReceSlaStr(unsigned char num)
{
unsigned char i;
DelayTime10us(15);
U0CTL |= MST; //主模式
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態:0,空閑;1:忙
I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST, SP (clears MST)
for (i=0;i<num;i++)
{
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // 等待地址應答位 ,判斷
rxDataArray = I2CDRB;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -