这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Cypress » PSoc4与PCF8563测试IIC通信

共8条 1/1 1 跳转至

PSoc4与PCF8563测试IIC通信

高工
2014-02-24 14:44:56     打赏

这两天要测试一块液晶,但液晶的程序也不知道是对的还是错的,所以就想用PSoc来测,根据前面的测试PSoc4自带的IIC模块来写驱动的话,事半功倍的!由于PCF8563的程序相对简单一点,所以就用这个来测试了。话不多说,先上程序:


/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * 说明:该程序用于测试PSoc4的IIC模块工作情况
 * 使用一块PCF8563实时时钟模块与PSoc4的IIC接
 * 口相连进行IIC通信(未使用PCF8563中断功能),
 * 具体引脚定义如下(可以在PSoc4_UART.cydwr文
 * 件中查看),在测试时使用评估板自带的USB-RS2
 * 32模块与电脑连接:
 * P12.6  ----  P4.1  (UART)
 * P12.7  ----  P4.0  (UART)
 * P0.4   ----  SCL(PCF8563)
 * P0.5   ----  SDA(PCF8563)
 * 2014-02-24 下午14:30
 * Veiko
 * ========================================
*/
#include 

/* PCB8563定义 */
#define Spcf8563 0x51  /* PCF8563从机地址,应用于PSoc4时要右移一位除去读写识别位 */
#define ContReg 0x00   //控制-状态寄存器1
#define SecdReg 0x02   //秒寄存器
#define MinuReg 0x03   //分钟寄存器
#define HourReg 0x04   //小时寄存器
#define YedaReg 0x05   //日寄存器
#define WemoReg 0x06   //星期寄存器
#define MoCeReg 0x07   //月-世纪寄存器
#define YearReg 0x08   //年寄存器
#define MiAlReg 0x09   //分钟报警寄存器
#define BehoReg 0x0c   //星期报警寄存器
#define BemiReg 0x0b   //日报警寄存器

/* 变量定义 */
unsigned char Sec = 0;        /* 用于存储秒数据 */
unsigned char Sec_Tmp = 0;    /* 用于对比秒数据是否发生改变 */
unsigned char UARTSendChar = 0;  /* 用于串口发送秒数据 */

/* 函数声明 */
void PCF8563_WriteReg(unsigned char SubAddr,unsigned char Data);
void PCF8563_Init(void);
unsigned char PCF8563Read(unsigned char SubAddr);

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    UART_Start();    /* 串口初始化 */
    IIC_M_Start();   /* IIC初始化 */
    
    CyGlobalIntEnable;   /* 使能全局中断 */
    
    //UART_SCB_IRQ_Start();   /* 打开串口中断 */
    
    PCF8563_Init();   //-----初始化PCF8563芯片
    
    

    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
       Sec = PCF8563Read(SecdReg);    
       if(Sec_Tmp != Sec)
        {
            UARTSendChar = ((Sec>>4)&0x0f)+0x30;
            UART_UartPutChar(UARTSendChar);
            UARTSendChar = (Sec&0x0f)+0x30;
            UART_UartPutChar(UARTSendChar);
            UART_UartPutChar('\r');
            UART_UartPutChar('\n');
            Sec_Tmp = Sec;
        }
    }
}
void PCF8563_WriteReg(unsigned char SubAddr,unsigned char Data)
{
    IIC_M_I2CMasterSendStart(0x51,0);    //-- 发送起始信号,从机地址写信号
    IIC_M_I2CMasterWriteByte(SubAddr);   //-- 发送寄存器地址(子地址)
    IIC_M_I2CMasterWriteByte(Data);      //-- 发送数据   
    IIC_M_I2CMasterSendStop();           //-- 发送停止信号
}

void PCF8563_Init(void)
{
    PCF8563_WriteReg(SecdReg,0x00);
	PCF8563_WriteReg(HourReg,0x00);
	PCF8563_WriteReg(MinuReg,0x00);
	PCF8563_WriteReg(YedaReg,0x01);
	PCF8563_WriteReg(MoCeReg,0x01);
	PCF8563_WriteReg(YearReg,0x09);
}

unsigned char PCF8563Read(unsigned char SubAddr)
{
    unsigned char DataRec = 0;
    IIC_M_I2CMasterSendStart(0x51,0);    //-- 发送起始信号,从机地址写信号
    IIC_M_I2CMasterWriteByte(SubAddr);   //-- 发送寄存器地址(子地址)
    
    IIC_M_I2CMasterSendRestart(0x51,1);    //-- 发送起始信号,从机地址读信号
    DataRec = IIC_M_I2CMasterReadByte(1);  //-- 读取一个字节并在结束通信前发送NACK应答位
    IIC_M_I2CMasterSendStop();           //-- 发送停止信号
    return DataRec;
}


/* [] END OF FILE */



前面几个笔记说过的东西,这里就不再说了,顺便把工程上传一个,希望对你有帮助:


——回复可见内容——

电脑回显效果:





关键词: PSoc4     PCF8563     通信     IIC通信    

高工
2014-02-24 14:51:04     打赏
2楼
不错,顶起。

助工
2014-02-25 08:24:03     打赏
3楼
看了看,楼主的代码风格和注解做得相当好,在嵌入式开发工程师里头算是典范!向你学习!!!

专家
2014-02-25 08:54:22     打赏
4楼
学习了!

高工
2014-02-25 09:15:06     打赏
5楼
额,只是为了以后能看懂,谢谢

专家
2014-03-10 18:22:05     打赏
6楼
学习了! 学习了! 学习了!

菜鸟
2016-06-21 20:22:29     打赏
7楼

菜鸟
2019-10-15 17:32:55     打赏
8楼

我现在I2CMasterWriteByte这个函数一直返回的I2C_MSTR_NOT_READY,请问楼主有遇到过吗?


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]