系统时钟源的选择
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/****************************************** ******************************************* *********************
* 文件名:iic.C
* 功能:实验二 GPIO控制实验
* 该实验采用CC2530的I/O口(P1.0和P1.1)模拟IIC总线的SCL和SDA,然后通过IIC 总线形式控制GPIO扩展芯片
* PCA9554,最后通过扩展的IO来控制LED的亮灭。
*
* 硬件连接:将OURS的CC2530RF模块插入到普通电池板或智能电池板上。
*
* P1.0 ------ SCL
* P1.1 ------ SDA
*
* 版本:V1.0
* 作者:WUXIANHAI
* 日期:2011.1.18
* 奥尔斯电子主页:
******************************************* ******************************************* ************************/
#include "ioCC2530.h"
#include "hal_mcu.h"
#define SCL P1_0 //IIC时钟线#define SDA P1_1 //IIC数据线
//定义IO方向控制函数
#define IO_DIR_PORT_PIN(port, pin, dir) \ do { \ if (dir == IO_OUT) \ P##port##DIR |= (0x01<<(pin)); \ else \ P##port##DIR &= ~(0x01<<(pin)); \ }while(0)
#define OSC_32KHZ 0x00 //使用外部32K晶体振荡器//时钟设置函数
#define HAL_BOARD_INIT() \
{
\
uint16 i; \
\
SLEEPCMD &= ~OSC_PD; /* 开启 16MHz RC 和32MHz XOSC */ \
while (!(SLEEPSTA & XOSC_STB));
/* 等待 32MHz XOSC 稳定 */ \
asm("NOP"); \
for (i=0; i<504; i++) asm("NOP");
/* 延时63us*/ \
CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ);
/* 设置 32MHz XOSC 和 32K 时钟 */ \
while (CLKCONSTA != (CLKCONCMD_32MHZ |
OSC_32KHZ)); /* 等待时钟生效*/
\
SLEEPCMD |= OSC_PD; /* 关闭 16MHz RC */ \
}
#define IO_IN 0 //输入
#define IO_OUT 1 //输出
uint8 ack; //应答标志位
uint8 PCA9554ledstate = 0; //所有LED当前状
态
/******************************************
************************************
* 函数名称:QWait
*
* 功能描述:1us的延时
*
* 参数:无
*
* 返回值:无
*******************************************
**********************************/
void QWait()
{
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");
}
/****************************************** ************************************
* 函数名称:Wait
*
* 功能描述:ms的延时
*
* 参数:ms - 延时时间
*
* 返回值:无
******************************************* **********************************/
void Wait(unsigned int ms)
{
unsigned char g,k;
while(ms)
{
for(g=0;g<=167;g++)
{
for(k=0;k<=48;k++);
}
ms--;
}
}
/****************************************** ************************************
* 函数名称:Start_I2c
*
* 功能描述:启动I2C总线,即发送I2C起始条件. *
* 参数:无 *
* 返回值:无
******************************************* **********************************/
void Start_I2c()
{
IO_DIR_PORT_PIN(1, 0, IO_OUT); //设置P1.0为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT); //设置P1.1为输出
SDA=1; /*发送起始条件的数据信号*/
asm("NOP");
SCL=1;
QWait(); /*起始条件建立时间大于4.7us,延时*/
QWait();
QWait();
QWait();
QWait();
SDA=0; /*发送起始信号*/ QWait(); /* 起始条件锁定时间大于4μs*/
QWait();
QWait();
QWait();
QWait();
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
asm("NOP");
asm("NOP");
}
/****************************************** ************************************
* 函数名称:Stop_I2c
*
* 功能描述:结束I2C总线,即发送I2C结束条件. *
* 参数:无
*
* 返回值:无