CC2430应用(一)-- AT24CXX的驱动程序 IIC 调试例程
来源:互联网 发布:养殖网络供销平台 编辑:程序博客网 时间:2024/04/29 03:41
前几天记录了STM32关于IIC芯片PFC8563的驱动程序。后来发现之前的一个CC2430的用于读写EEPROM AT24CXX的程序。这个程序是使用的IO口模拟IIC数据传输逻辑。刚好可以弥补STM32中被硬件模块所替代的部分。具有一定的参考价值。
这个例程和51之类的芯片例程最大的区别仅仅在于IO读写部分需要特别设置。用惯了MSP430类型MCU的人应该很容易理解
不过这个程序没有经过高速读写测试,不知道性能极限是什么样子的。
例程:
iic_cc2430.h中的内容
#ifndef IIC_H
#define IIC_H
#define uint unsigned int
#define uchar unsigned char
#define False 0
#define True 1
#define Write_At24c512 0xa0
#define Read_At24c512 0xa1
void NOP(void); //延时
void StartI2C(void); //启动函数
void StopI2C(void); //结束函数
void SendByte(unsigned char c); //字节发送函数
unsigned char RevByte(void); //字节接受函数
unsigned char WriteEeprom(unsigned char Write_Data); //EEPROM数据写入函数
unsigned char ReadEeprom(void); //EEPROM数据读出函数
void setaddr(unsigned int addr); //IIC地址转换函数
#endif
iic_cc2430.c文件的内容
// this is for IIC EEProm test
#include<ioCC2430.h>
#include "IIC.h"
#define FREQ 30//延时参数
unsigned char ack;//IIC 应答标志
unsigned char Write_Flag;
unsigned char Read_Flag;
unsigned char DATA_RETURN;
unsigned char ADDR_L;
unsigned char ADDR_H;
void _nop_()
{
unsigned int nop;
nop = FREQ;
while(nop--);
}
void WriteSDA1(void)//SDA output 1
{
P1DIR |= 0x40;
P1_6 = 1;
}
void WriteSDA0(void)
{
P1DIR |= 0x40;
P1_6 = 0;
}
void WriteSCL1(void)
{
P1DIR |= 0x80;
P1_7 = 1;
}
void WriteSCL0(void)
{
P1DIR |= 0x80;
P1_7 = 0;
}
void ReadSDA(void)
{
P1DIR &= 0xBF;
}
void setaddr(unsigned int addr)
{
ADDR_H = addr;///256;
// ADDR_L = addr%256;//根据IIC芯片的具体内存地址
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void main(void)
{
unsigned char i = 0x00;
P1DIR = 0xff;
P1 = 0;
DATA_RETURN = 0x00;
while(i<9)
{
setaddr(++i);
WriteEeprom(i);
NOP();
DATA_RETURN = 0x00;
setaddr(i);
DATA_RETURN = ReadEeprom();
NOP();
}
DATA_RETURN = 0x00;
setaddr(0x4);
DATA_RETURN = ReadEeprom();
setaddr(0x2);
DATA_RETURN = ReadEeprom();
setaddr(0x7);
DATA_RETURN = ReadEeprom();
setaddr(0x6);
DATA_RETURN = ReadEeprom();
}
////////////////////////////////////////////////////////
// origion code
///////////////////////////////////////////////////////
void NOP(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*******************IIC启动函数************************/
void StartI2C(void)
{
WriteSDA1();//发送起始条件数据信号
WriteSCL1();
_nop_(); //起始建立时间大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WriteSDA0(); //发送起始信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WriteSCL0(); //钳位
_nop_();
_nop_();
}
/*************结束总线函数***************************/
void StopI2C(void)
{
WriteSDA0(); //发送结束条件的数据信号
_nop_(); //发送结束条件的时钟信号
WriteSCL1(); //结束条件建立时间大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WriteSDA1(); //发送I2C总线结束命令
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*************字节数据传送函数************************/
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt = 0;BitCnt < 8;BitCnt++) //一个字节
{
if((c << BitCnt)& 0x80)
{
WriteSDA1(); //判断发送位
}
else
{
WriteSDA0();
}
_nop_();
WriteSCL1(); //时钟线为高,通知被控器开始接受数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WriteSCL0();
}
_nop_();
_nop_();
WriteSDA1(); //释放数据线,准备接受应答位
_nop_();
_nop_();
WriteSCL1();
_nop_();
_nop_();
_nop_();
P1DIR |= 0x00;
_nop_();
_nop_();
if(P1_6 == 1) //判断DATA位是否有反馈
{
ack = 0x00; //运行至此说明没有反馈
}
else
{
ack = 0x01; //判断是否收到应答信号
}
WriteSCL0();
_nop_();
_nop_();
_nop_();
}
/*************字节数据接收函数***************************/
unsigned char RevByte(void)
{
unsigned char retc;
unsigned char BitCnt;
retc = 0;
WriteSDA1();
for(BitCnt=0;BitCnt<8;BitCnt++)
{
WriteSCL0(); //置时钟线为低,准备接收
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WriteSCL1(); //置时钟线为高使得数据有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ReadSDA();
retc = retc << 1; //左移补零
if(P1_6 == 1)
{
retc = retc + 1; //当数据为真加一
}
}
WriteSCL0();
_nop_();
_nop_();
return(retc);//返回接收数据
}
unsigned char WriteEeprom(unsigned char Write_Data)
{
StartI2C();
SendByte(Write_At24c512);
if(ack == 1)
{
SendByte(ADDR_H);
if(ack == 1)
{
//SendByte(ADDR_L);
//if(ack == 1)
//{
SendByte(Write_Data);
if(ack == 1)
{
StopI2C();
_nop_();
return Write_Data;
}
//}
}
}
return 0xfe;
}
unsigned char ReadEeprom(void)
{
unsigned char Read_Data;
StartI2C();
SendByte(Write_At24c512);
if(ack == 1)
{
SendByte(ADDR_H);
if(ack==1)
{
//SendByte(ADDR_L);
//if(ack)
//{
StartI2C();
SendByte(Read_At24c512);
if(ack == 1)
{
Read_Data = RevByte();
StopI2C();
_nop_();
return Read_Data;
}
//}
}
}
return 0xfe;
}
- CC2430应用(一)-- AT24CXX的驱动程序 IIC 调试例程
- AT24CXX(器件) 和 IIC总线(从畅学网复制的)
- IIC驱动程序分析(一)
- IIC驱动程序分析(一)
- IIC设备驱动程序(一)————IIC设备的总线及其协议
- STM32模拟IIC读写AT24CXX
- AT24Cxx芯片读写--IIC总线
- IIC设备驱动程序(三)————IIC设备驱动程序的层次结构
- IIC驱动程序分析(二)
- IIC驱动程序分析(三)
- IIC驱动程序分析(二)
- IIC驱动程序分析(三)
- CC2430调试接口与JTAG的区别
- IIC设备驱动程序(二)————IIC设备的硬件原理
- Linux驱动程序的结构例程
- IIC的应用
- IIC专题(一)-Smart210的I2C操作使用I2C通用驱动撰写用户态驱动程序
- LINUX下的IIC驱动(一)
- 百度站长俱乐部问答汇总—更新时间:2010年04月11日
- 大家帮帮我
- 概念
- 送给大学同学元宝的祝福
- CSS hack:区分IE6、IE7、IE8、Firefox、Opera
- CC2430应用(一)-- AT24CXX的驱动程序 IIC 调试例程
- OpenGL中的转换矩阵
- 在ASP.Net 2.0中实现多语言界面的方法
- 卡方检验 总结
- 手机屏幕大小、分辨率数据库
- 遇到repair filesystem 1 #的问题记录下解决办法
- Flex httpservice返回值类型和处理
- (转)跨浏览器获取滚动条高度
- 让山寨机支持flash播放,绚起来(1)