@floatsd
2016-01-02T11:26:20.000000Z
字数 4498
阅读 1231
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); //选择数字管1
I2C_U5TubeLowPinControl(tubeDigital[a][0]);//拉低U5的引脚
I2C_U3TubeHighPinControl(tubeDigital[a][1]);//拉高U3引脚
DelayMs(t);
I2C_ClearTheTube(); //清屏
I2C_U4TubeSelect(~0x02); //选择数字管2
I2C_U5TubeLowPinControl(tubeDigital[b][0]);//拉低U5的引脚
I2C_U3TubeHighPinControl(tubeDigital[b][1]);//拉高U3引脚
DelayMs(t);
I2C_ClearTheTube(); //清屏
I2C_U4TubeSelect(~0x04); //选择数字管3
I2C_U5TubeLowPinControl(tubeDigital[c][0]);//拉低U5的引脚
I2C_U3TubeHighPinControl(tubeDigital[c][1]);//拉高U3引脚
DelayMs(t);
I2C_ClearTheTube(); //清屏
I2C_U4TubeSelect(~0x08); //选择数字管4
I2C_U5TubeLowPinControl(tubeDigital[d][0]);//拉低U5的引脚
I2C_U3TubeHighPinControl(tubeDigital[d][1]);//拉高U3引脚
DelayMs(t);
}