一、UART
UART---通用异步收发传输器;
串行、异步、全双工(两个方向上同时传输,即发送和接收可以同时进行)通信协议
读一个数据初始化UART0
4 先清零、后置位
void uart0_init(void)
{
GPHCON &= ~(0xf << 4); //配置GPH2、3功能为RXD、TXD
GPHCON |= (0xA << 4);
ULCON0 &= ~(1 << 6); //普通模式
ULCON0 &= ~(7 << 3); //无校验
ULCON0 &= ~(1 << 2); //1位停止位
ULCON0 |= ~(0x3 << 0); //数据位8位
UCON0 &= ~(0x3 << 10);
UCON0 |= ~(0x2 << 10); //时钟选择PCLK -- 50M
UCON0 &= ~(0xf << 0);
UCON0 |= ~(0x5 << 0); //中断或轮询模式
UBRDIV0 = 325;//波特率 9600
}
发送数据
void uart_send(unsigned char * data, int len)
{
int i = 0;
for(i = 0;i < len; i++)
{
while(!(UTRSTAT0 & (1 << 2)));
UTXH0 = data[i];
}
}
接收数据
unsigned char uart_recv_byte(void)
{
unsigned char data = 0;
while(!(UTRSTAT0 & (1 << 0)));
data = URXH0;
return data;
}
主函数
int main(void)
{
unsigned char data = 0;
uart0_init();
while(1)
{
data = uart_recv_byte();
data++;
uart_send(&data,1);
}
return 0;
}
其他补充
二、IIC
IIC --- 集成电路总线 ;
低速、半双工(不能同时发送和接收数据,同一时刻只能有一个方向上的传输存在)、同步的串行通信总线
一般主机控制SCLK时钟线
每次通信都由主机发起,7位地址+1位读/写
为了控制多主控 IIC 总线操作,必须写入值到以下寄存器中:
– 多主控 IIC 总线控制寄存器,IICCON
– 多主控 IIC 总线控制/状态寄存器,IICSTAT
– 多主控 IIC 总线 Tx/Rx 数据移位寄存器,IICDS
– 多主控 IIC 总线地址寄存器,IICADD
S3C2440A的IIC总线接口有4种工作模式:
- 主机发送模式
- 主机接收模式
- 从机发送模式
- 从机接收模式
初始化IIC
void iic_init(void)
{
//配置GPE14、15引脚功能为SCL、SDA
GPECON &= ~(0xf << 28);
CPECON |= (0xa << 28);
IICCON |= (1 << 7); //使能应答
IICCON |= (1 << 6); //PCLK/512
IICCON |= (1 << 5); //允许中断
IICCON &= ~(0xf << 0); // 预分频1
}
主机发送模式
void iic_write(unsigned char addr, unsigned char * data, int len)
{
int i = 0;
IICSTAT |= (0x3 << 6);
IICDS = addr;
IICSTAT = 0xf0;
//IICCON &= ~(1 << 4); //清除挂起位
while(!(IICCON & (1 << 4))); //等待挂起标志
for(i = 0; i < len; i++)
{
IICDS = data[i];
IICCON &= ~(1 << 4); //清除挂起位
while(!(IICCON & (1 << 4))); //等待挂起标志
}
IICSTAT = 0xd0;
IICCON &= ~(1 << 4); //清除挂起位
}
主机接收模式
int iic_read(unsigned char addr, unsigned char * data, int len)
{
int i = 0;
IICSTAT &= ~(0x3 << 6);
IICSTAT |= (0x2 << 6);
IICDS = addr;
IICSTAT = 0xb0;
//IICCON &= ~(1 << 4); //清除挂起位
while(!(IICCON & (1 << 4))); //等待挂起标志
for(i = 0; i < len; i++)
{
data[i] = IICDS;
IICCON &= ~(1 << 4); //清除挂起位
while(!(IICCON & (1 << 4))); //等待挂起标志
}
IICSTAT = 0x90;
IICCON &= ~(1 << 4); //清除挂起位
return i;
}