国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品
電子工程網
標題:
CortexM0菜鳥之I2C主機中斷(第10天作業)
[打印本頁]
作者:
hotpower
時間:
2010-9-7 01:21
標題:
CortexM0菜鳥之I2C主機中斷(第10天作業)
菜農此I2C模板應用8年未嘗敗績,大家可以和NXP例程對比,
俺就不公開和NXP“
PK
”了~~~
//i2c.h
#include "main.h"
#ifndef __LPC11xxI2c_H__
#define __LPC11xxI2c_H__
#ifdef __cplusplus
extern "C" {
#endif
class I2cObj;
class I2cObj {//系統串口類
public:
I2cObj(unsigned char I2CAddress = 0xa1);
private:
inline void I2cInit(void);
public:
inline void Start(void);
inline void REStart(void);
inline void Stop(void);
inline void Exit(void);
inline void Exec(void);
void SetAddress(unsigned char I2CAddress);
void WriteWait(void);
unsigned char ReadByte(unsigned char, unsigned char &);
unsigned char WriteByte(unsigned char, unsigned char);
public:
volatile bool Busy;
volatile unsigned int State;
volatile unsigned int Count;
volatile unsigned int MainCount, SubCount;
volatile unsigned char SubAddr;
volatile unsigned char MainComm, SubComm;
volatile unsigned char TxBuffer[16], RxBuffer[16];//接收數據緩沖區
};
extern "C" void __irq I2C_IRQHandler(void);
#ifdef __cplusplus
}
#endif
#endif//__LPC11xxI2c_H__
//i2c.cpp
#include "i2c.h"
extern "C" void __irq I2C_IRQHandler(void)
{
I2c.Exec();
}
I2cObj::I2cObj (unsigned char I2CAddress)
{
SubAddr = I2CAddress;
I2cInit();
}
void I2cObj::I2cInit(void)
{
SYSCON.PRESETCTRL.Bits.I2C0_RST_N = 1;//復位I2C,否則死機
SYSCON.SYSAHBCLKCTRL.Bits.I2CCLK = 1;
//位域寫法
IOCON.PIO0_4.Bits.FUNC = IOCON_SCL;//選擇PIO0.4為I2C_SCL
IOCON.PIO0_4.Bits.I2CMODE = IOCON_SCL_I2CMODE;//選擇PIO0.4為I2C_SCL
IOCON.PIO0_5.Bits.FUNC = IOCON_SDA;//選擇PIO0.5為I2C_SCL
IOCON.PIO0_5.Bits.I2CMODE = IOCON_SDA_I2CMODE;//選擇PIO0.5為I2C_SDA
//寄存器寫法
/*
IOCON.PIO0_4.Regs = (IOCON_SCL << IOCON_FUNC)
| (IOCON_SCL_I2CMODE << IOCON_I2CMODE);
IOCON.PIO0_5.Regs = (IOCON_SDA << IOCON_FUNC)
| (IOCON_SDA_I2CMODE << IOCON_I2CMODE);
*/
I2C0.SCLL.Regs = 0x00000180;
I2C0.SCLH.Regs = 0x00000180;
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI);
I2C0.CONSET.Bits.I2EN = 1;
for (int i = 0; i < sizeof(TxBuffer); i ++) {
TxBuffer
= 0;
RxBuffer
= 0;
}
Exit();//通訊失敗
nVIC.ISER.Bits.I2C_IRQn = 1;
}
void I2cObj::SetAddress(unsigned char I2CAddress)
{
SubAddr = I2CAddress;
}
void I2cObj::Start(void)
{
Busy = true;
State = I2C_START;//主機準備發送啟始位
Count = 0;//發送數據個數
I2C0.CONSET.Regs = (1 << I2EN) | (1 << STA);//設置使能起始標志
}
void I2cObj::REStart(void)
{
Busy = true;
State = I2C_REP_START;//主機準備發送啟始位
Count = 0;//發送數據個數
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);//清除標志
I2C0.CONSET.Regs = (1 << I2EN) | (1 << STA);//設置使能起始標志
}
void I2cObj::Stop(void)
{
Busy = false;
State = I2C_BUS_OK;//通訊成功
I2C0.CONSET.Regs = (1 << I2EN) | (1 << STO);
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);
}
void I2cObj::Exit(void)
{
Busy = false;
State = I2C_BUS_ERROR;//通訊失敗
I2C0.CONSET.Regs = (1 << I2EN) | (1 << STO);
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);
}
void I2cObj::WriteWait(void)
{
for(int i = 0; i < 18888; i ++)
{
__nop();//延時等待寫入完成
}
}
void I2cObj::Exec(void)
{
switch(I2C0.STAT.Regs & 0xf8) {
case I2C_START://主機收到自己發送的開始信號
if (State == I2C_START) {//本次中斷應該接收TW_START信號
I2C0.DAT.Regs = SubAddr & 0xfe;//發送子機地址(寫)
State = I2C_MT_SLA_ACK;//Status下次I2C_MT_SLA_ACK
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);//清除中斷標志
}
else Exit();//通訊失敗
break;
case I2C_REP_START://主機收到自己發送的重新開始信號
if (State == I2C_REP_START) {//本次中斷應該接收TW_RESTART信號
I2C0.DAT.Regs = SubAddr | 0x01;//發送子機地址(讀)
State = I2C_MR_SLA_ACK;//Status下次I2C_MR_SLA_ACK
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);//清除中斷標志
}
else Exit();//通訊失敗
break;
case I2C_MT_SLA_ACK://主發機接收到從機的地址應答信號后發送命令
if (State == I2C_MT_SLA_ACK) {//本次中斷應該接收TW_MT_SLA_ACK信號
State = I2C_MT_DATA_ACK;//Status下次應該收TW_MT_DATA_ACK
I2C0.DAT.Regs = SubComm;//發送子機命令
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);//清除中斷標志
}
else Exit();//通訊失敗
break;
case I2C_MR_SLA_ACK://主收機接收到從機的地址應答信號
if ((State == I2C_MR_SLA_ACK) && SubCount) {//本次中斷應該接收TW_MR_SLA_ACK信號
State = I2C_MR_DATA_ACK;//Status下次應該收TW_MR_DATA_ACK
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI);//清除中斷標志,主機轉入接收狀態
I2C0.CONSET.Bits.AA = 1;
}
else Exit();//通訊失敗
break;
case I2C_MT_DATA_ACK://主收機接收到從機的數據應答信號
if ((State == I2C_MT_DATA_ACK) && (Count < MainCount)) {//本次中斷應該接收TW_MT_DATA_ACK信號
I2C0.DAT.Regs = TxBuffer[Count ++];//發送子機數據
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);//清除中斷標志
}
else {
if ((State == I2C_MT_DATA_ACK) && (Count == MainCount) && (SubAddr & 1)) {//本次中斷應該接收TW_MT_DATA_ACK信號
REStart();//
}
else Stop();//通訊成功
}
break;
case I2C_MR_DATA_ACK:
if ((State == I2C_MR_DATA_ACK) && (Count < SubCount)) {
RxBuffer[Count ++] = I2C0.DAT.Regs;//接收子機數據
if (Count < SubCount) {
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI);//主機轉入接收狀態
I2C0.CONSET.Bits.AA = 1;
}
else {
I2C0.CONCLR.Regs = (1 << STA) | (1 << SI) | (1 << AA);//清除中斷標志,主機轉入接收狀態
State = I2C_MR_DATA_NACK;//下次進入I2C_MR_DATA_NACK,接收數據準備完成
}
}
else Exit();//通訊失敗
break;
case I2C_MR_DATA_NACK://數據接收結束
if ((State == I2C_MR_DATA_NACK) && (Count == SubCount)) {
Stop();//通訊成功
}
else Exit();//通訊失敗
break;
// case I2C_MT_DATA_NACK:
// Exit();//通訊失敗
// break;
default:
Exit();//通訊失敗
}
}
unsigned char I2cObj::ReadByte(unsigned char Address, unsigned char & Data)
{
SubAddr |= 0x01;
MainCount = 0;//發送0個數據(只讀)
//本程序為通用I2C,故發送器件后一般為命令,對EEPROM來說,命令實際是EEPROM地址
SubComm = Address;//讀出地址
SubCount = 1;//接收1個數據
Start();
while (Busy);
if (State == I2C_BUS_OK) {//通訊成功
Data = RxBuffer[0];//取出一個字節
}
return State;//(讀出數據在RxBuffer[0]~RxBuffer[15])
}
unsigned char I2cObj::WriteByte(unsigned char Address, unsigned char Data)
{
SubAddr &= 0xfe;
MainCount = 1;//發送1個數據
//本程序為通用I2C,故發送器件后一般為命令,對EEPROM來說,命令實際是EEPROM地址
SubComm = Address;//寫入地址
TxBuffer[0] = Data;//寫入數據
SubCount = 0;//接收0個數據
Start();
while (Busy);
if (State == I2C_BUS_OK) {//通訊成功
PortLed1.DATA.Bits.PinLed1 = 0;//LED1亮
}
return State;
}
//讀LM75
I2c.SetAddress(0x90);//設置LM75器件地址
I2c.WriteByte(1, Data);//寫配置命令1
I2c.ReadByte(0, Data);//讀溫度命令0
Uart.Send(Data);
//讀寫AT24C16
I2c.SetAddress(0xa0);//設置AT24C16器件地址
for (int i = 1; i < 16; i ++)//延時
{
I2c.WriteByte(i, i);//寫入EEPROM一個字節
I2c.WriteWait();//延時等待寫入完成
I2c.ReadByte(i, Data);//讀出EEPROM一個字節
Uart.Send(Data);
}
HotPower@163.com
2010.9.6 23:58 于雁塔菜地
菜農通訊工具:
新浪網頁版:
http://t.sina.com.cn/hotpower
新浪手機版:
http://t.sina.cn/hotpower
網 易微 博:
http://t.163.com/hotpower
騰訊QQ: 1270688699
菜農郵箱:
HotPower@163.com
菜農導航:
http://www.hotpage.net.cn/
作者:
zshuishi
時間:
2010-9-10 16:08
頂一個
歡迎光臨 電子工程網 (http://m.qingdxww.cn/)
Powered by Discuz! X3.4
主站蜘蛛池模板:
麻豆天美果冻星空91制片厂
|
特黄日韩免费一区二区三区
|
午夜色大片在线观看
|
国产一卡二卡3卡4卡更新
|
香蕉视频在线网址
|
国产视频h
|
日本精品在线观看
|
九九久久精品视频
|
一级做a爰片久久毛片人呢 一级做a爰片久久毛片免费看
|
亚洲成人手机在线观看
|
一级a爰片久久毛片
|
特黄特色的视频免费播放
|
国产精品久久久久免费
|
色在线网站
|
日本网站免费
|
女人18毛片特级一级免费视频
|
h肉动漫在线观看免费资源 h肉动漫在线观看高清
|
国产午夜视频在线观看第四页
|
成人免费午间影院在线观看
|
久久久精品视频免费观看
|
亚洲影视在线观看
|
91探花福利精品国产自产在线
|
四虎影视亚洲精品
|
99久久伊人精品波多野结衣
|
激情天堂
|
国产99视频精品免费视频7
|
国产一级片播放
|
国产精品国产三级国产普通
|
狠狠色丁香婷婷综合激情
|
欧美最新在线
|
99久久精品国产自免费
|
精品欧美成人高清视频在线观看
|
色一情一区二区三区四区
|
成人9久久国产精品品
|
亚欧乱色视频 视频在线
|
欧美精品久久久久久久久大尺度
|
国产经典自拍
|
手机国产日韩高清免费看片
|
日本精品视频一视频高清
|
精品视频在线视频
|
高清不卡免费一区二区三区
|