@floatsd
2016-01-02T11:26:20.000000Z
字数 4498
阅读 1454
CM4实验报告
- 了解总线通信原理
- 学会用C语言模拟时序
- 学会查找和利用板子上的资源,控制米字管
- 发送器:本次传送中发送数据(不包括地址和命令)到总线的器件。
- 接收器:本次传送中从总线接收数据(不包括地址和命令)的器件。
- 主机:初始化发送,产生时钟信号和终止发送的器件,它可以是发送器或接收器,主机通常是微控制器。
- 从机:被主机寻址的器件,他可以是发送器或接收器。
| SDA | SCL | 总线状态 |
|---|---|---|
| 高电平 | 高电平 | 空闲(stop之后) |
| 高到低 | 高电平 | START(之后视为忙状态) |
| 低到高 | 高电平 | STOP |
上表所示总线起止条件如图所示:

而每传送一个命令所包含的数据如下:一个起始位,从机地址,ACK校验位,命令字,ACK校验位,数据,最后再是一个ACK校验位,由此可以改变帧头帧尾制定通信协议。它们形式如下:

简单地说是一种总线,它的接收器和发射器都在总线上接收发送数据,也即分别通过SCL和SDA线接入总线。一定有主机和从机。板子上的资源和特性如下:
| 芯片 | 端口 | 管脚 |
|---|---|---|
| U4 | P1 | 2 |
| P2 | 3 | |
| P3 | 4 | |
| P4 | 5 | |
| P5 | 1 | |
| U5 | P1 | 8 |
| P2 | 9 | |
| P3 | 10 | |
| P4 | 11 | |
| P5 | 12 | |
| P6 | 13 | |
| P7 | 14 | |
| U6 | P1 | 16 |
| P2 | 17 | |
| P3 | 18 | |
| P4 | 7 | |
| P5 | 15 |



static const char tubeDigital[10][2]={ // SegmLow, SegHigh{ 0x10, 0x3E }, // 0{ 0x00, 0x18 }, // 1{ 0x70, 0x2C }, // 2{ 0x70, 0x26 }, // 3{ 0x60, 0x32 }, // 4{ 0x70, 0x16 }, // 5{ 0x70, 0x1E }, // 6{ 0x00, 0x26 }, // 7{ 0x70, 0x3E }, // 8{ 0x70, 0x36 }, // 9};
/******************************************************************** 函数: I2C_Init()* 描述: I2C初始化* 输入值:无* 返回值:无*****************************************************************/void I2C_Init(){SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);/*B2设置为SCL时钟线,B3设置为SDA串行数据线*/GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);/*设置B的引脚复用功能为SCL和SDA*/GPIOPinConfigure(GPIO_PB2_I2C0SCL);GPIOPinConfigure(GPIO_PB3_I2C0SDA);GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); //使能I2C0模块/* 设I2C主机模式, 使用系统时钟, 400kbps的快速模式(false普通模式100Kbps)*/I2CMasterInitExpClk(I2C0_BASE,1000000, true);I2CMasterEnable(I2C0_BASE); //使能I2C0主机模式I2CSlaveEnable(I2C0_BASE);//使能I2C从机模式}
/********************************************************************* 函数: PCA9557_Init()* 描述: PCA9557初始化* 输入值:无* 返回值:无******************************************************************/void PCA9557_Init(){ uint8_t SendBuff[2] = {PCA9557_REG_CONFIG, 0x00};//PCA9557_REG_CONFIG(COMMAND BYTE)配置成读写模式I2C_SendBuff(I2C0_ADDR_TUBE_SEL, SendBuff, 2);//U21管选 I2C0_ADDR_TUBE_SEL (SLAVE ADDR)I2C_SendBuff(I2C0_ADDR_TUBE_SEG_LOW, SendBuff, 2);//U22管选 I2C0_ADDR_TUBE_SEG_LOW(SLAVE ADDR)I2C_SendBuff(I2C0_ADDR_TUBE_SEG_HIGH, SendBuff, 2);//U23管选 I2C0_ADDR_TUBE_SEG_HIGH(SLAVE ADDR)}
/******************************************************************** 函数: MZG_run()* 描述: 点亮米字管为a,b,c,d(在while里的动态显示)* 输入值:uint8_t a,b,c,d* 返回值:无*****************************************************************/void MGZ_run(){int t=50;//这个延时时间I2C_ClearTheTube(); //清屏I2C_U4TubeSelect(~0x20); //选择数字管1I2C_U5TubeLowPinControl(tubeDigital[a][0]);//拉低U5的引脚I2C_U3TubeHighPinControl(tubeDigital[a][1]);//拉高U3引脚DelayMs(t);I2C_ClearTheTube(); //清屏I2C_U4TubeSelect(~0x02); //选择数字管2I2C_U5TubeLowPinControl(tubeDigital[b][0]);//拉低U5的引脚I2C_U3TubeHighPinControl(tubeDigital[b][1]);//拉高U3引脚DelayMs(t);I2C_ClearTheTube(); //清屏I2C_U4TubeSelect(~0x04); //选择数字管3I2C_U5TubeLowPinControl(tubeDigital[c][0]);//拉低U5的引脚I2C_U3TubeHighPinControl(tubeDigital[c][1]);//拉高U3引脚DelayMs(t);I2C_ClearTheTube(); //清屏I2C_U4TubeSelect(~0x08); //选择数字管4I2C_U5TubeLowPinControl(tubeDigital[d][0]);//拉低U5的引脚I2C_U3TubeHighPinControl(tubeDigital[d][1]);//拉高U3引脚DelayMs(t);}