?? iic.c
字號:
/********************************************************
* 文件名稱:
* IIC.c
* 文件說明:
* 使用口線模擬IIC
*********************************************************/
#define MSP_IIC 0
#ifndef MSP430F449_H
#include <msp430x44x.h>
#endif
/*********************************************************
* 數據定義
*********************************************************/
unsigned char read_Buf, //讀緩沖區
write_Buf, //寫緩沖區
ctrl_Buf, //用于存放控制指令等的中間緩沖區
addr_Buf, //高地址緩沖
ack_Flag; //應答標識
/************************************************
* 延遲
************************************************/
void iic_Delay(void)
{
_NOP();
_NOP();
_NOP();
}
/*********************************************************
* 啟動IIC
*********************************************************/
void start_IIC(void)
{
P4OUT &= 0x3f; //設置P4OUT
P4DIR &= 0x7f; //SDA = 1
iic_Delay();
P4DIR &= 0xbf; //SCL = 1
iic_Delay();
P4DIR |= 0x80; //SDA = 0
iic_Delay();
P4DIR |= 0x40; //SCL = 0
iic_Delay();
}
/*******************************************************
* 停止IIC
*******************************************************/
void stop_IIC(void)
{
P4DIR |= 0x80; //SDA = 0
iic_Delay();
P4DIR &= 0xbf; //SCL = 1
iic_Delay();
P4DIR &= 0x7f; //SDA = 1
iic_Delay();
P4DIR |= 0x80; //SDA = 0
iic_Delay();
P4DIR |= 0x40; //SCL = 0
}
/*******************************************************
* 發送 0
*******************************************************/
void send_Zero(void)
{
P4DIR |= 0x80; //SDA = 0
iic_Delay();
P4DIR &= 0xbf; //SCL = 1
iic_Delay();
P4DIR |= 0x40; //SCL = 0
iic_Delay();
}
/*******************************************************
* 發送 1
*******************************************************/
void send_One(void)
{
P4DIR &= 0x7f; //SDA = 1
iic_Delay();
P4DIR &= 0xbf; //SCL = 1
iic_Delay();
P4DIR |= 0x40; //SCL = 0
iic_Delay();
P4DIR |= 0x80; //SDA = 0
iic_Delay();
}
/*******************************************************
* 發送一個字節數據
*******************************************************/
void send_Char(void)
{
unsigned char cnt,tmp=0x80;
for(cnt=0;cnt<8;cnt++)
{
if((ctrl_Buf & tmp )> 0)
{
send_One(); // 發送1
}else
{
send_Zero(); // 發送0
}
tmp /= 2; // tmp右移一位
}
}
/*******************************************************
* 讀一個byte數據
*******************************************************/
void read_Char(void)
{
unsigned char cnt,tmp=0x80;
read_Buf = 0x00;
for(cnt=0;cnt<8;cnt++)
{
P4DIR &= 0x7f; //SDA = 1
iic_Delay();
P4DIR &= 0xbf; //SCL = 1
iic_Delay();
if((P4IN & 0x80) > 0x00)
{ // 收到 1
read_Buf |= tmp;
}
P4DIR |= 0x40; //SCL = 0
iic_Delay();
tmp = tmp/2;
}
}
/*************************************************
* 應答信號
*************************************************/
void iic_ACK(void)
{
ack_Flag = 0x00;
P4DIR &= 0x7f; //SDA = 1
iic_Delay();
P4DIR &= 0xbf; //SCL = 1
iic_Delay();
if ((P4IN & 0x80) == 0x80 )
{
ack_Flag = 0x01;
}
P4DIR |= 0x40; //SCL = 0
iic_Delay();
}
/***********************************************
* iic_NACK
************************************************/
void iic_NACK(void)
{
P4DIR &= 0x7f; //SDA = 1
iic_Delay();
P4DIR &= 0xbf; //SCL = 0
iic_Delay();
P4DIR |= 0x40; //SCL = 0
iic_Delay();
P4DIR |= 0x80; //SDA = 0
iic_Delay();
}
/************************************************
* 寫一個數據到EEPROM
*************************************************/
void write_EEPROM(void)
{
unsigned char step_Flag=0x00;
while(step_Flag < 0x03)
{
if(step_Flag == 0x00)
{
start_IIC(); // 啟動 I2c
ctrl_Buf = 0xA0; // 設置控制位
send_Char(); // 發送控制位
iic_ACK(); // 確認
if (ack_Flag == 0) step_Flag += 1;
}else if (step_Flag==1)
{
ctrl_Buf = addr_Buf; // 設置地址
send_Char(); // 發送地址
iic_ACK(); // 讀 確認
if (ack_Flag == 0)
{ // 檢測是否地址發送成功
step_Flag += 1;
}else{
step_Flag = 0;
}
}else{
ctrl_Buf = write_Buf; // 設置寫內容
send_Char(); // 寫
iic_ACK(); // 讀響應信息
if (ack_Flag == 0)
{ // 檢測是否寫成功
step_Flag += 1;
}else{
step_Flag = 0;
}
}
}
stop_IIC(); // 停止 IIC
}
/*************************************************
* 從EEPROM讀數據
*************************************************/
void read_EEPROM()
{
unsigned char step_Flag=0;
while(step_Flag < 0x03)
{
if(step_Flag == 0x00)
{
start_IIC(); //啟動 I2c
ctrl_Buf = 0xa0; //設置控制位
send_Char(); //發送控制位
iic_ACK(); //讀取應答
if (ack_Flag == 0) step_Flag += 1;
}else if (step_Flag==1){ // 如果控制位發送成功
ctrl_Buf = addr_Buf; // 設置讀地址
send_Char(); // 發送地址
iic_ACK(); // 讀響應
if (ack_Flag == 0)
{ // 是否地址已經發送
step_Flag += 1;
}else{
step_Flag = 0;
}
}else{
start_IIC(); // 啟動 IIC
ctrl_Buf = 0xa1; // 設置讀模式
send_Char(); // 發送控制位
iic_ACK(); // 獲取響應
if (ack_Flag == 0)
{ // 是否發送成功
step_Flag += 1;
read_Char(); // 讀字符
iic_NACK(); // 發響應
}else{
step_Flag = 0;
}
}
}
stop_IIC(); // 停止 IIC
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -