zhange
发表于 2024-5-20 12:57:31
本帖最后由 zhange 于 2024-5-20 16:02 编辑
第二十九集:SPI读写FLASH芯片
1.1维数组名就是这个数组的首地址,也是一个指针。
2.和一个器件spi协议链接,首先要读器件的手册,切记
3.啥叫在同一个页里面写???
4.读地址读两次,芯片可能休眠,第一次读出来可能不正确。
5.看一遍看的迷迷糊糊,好像看懂了,又好像??
====等我看完全集二刷====
zhange
发表于 2024-5-20 17:22:05
本帖最后由 zhange 于 2024-5-21 13:27 编辑
第三十集:软件模拟IIC上
1. 另一个总线,同步串行总线。
2.这节还是软件模拟。
3.空闲状态:scl sda都是高电平。
4.IIC协议分析
5.这里是软件模拟,应答信号也可以模拟吧????
6.发送数据时,scl为1时sda电平不能改变。
7.启动信号
函数编写 开始
void iicStart(void) //开始
{
SCL = 1;
SDA = 1;
Delay2us();
SDA = 0;
Delay2us();
SCL = 0;
Delay2us();
}
停止
void iicStop(void) //结束
{
SCL = 0;
SDA = 0;
Delay2us();
SCL = 1;
Delay2us();
SDA = 1;
Delay2us();
}
8.教程里iic是连接的外设msb数据传输方式,高位在前,低位在后。
vb2002
发表于 2024-5-21 09:08:52
向你学习,我学了好几天都没什么头绪
qike009
发表于 2024-5-21 10:07:41
vb2002 发表于 2024-5-21 09:08
向你学习,我学了好几天都没什么头绪
俺也一样。。
zhange
发表于 2024-5-21 13:29:29
本帖最后由 zhange 于 2024-5-21 16:24 编辑
第三十集:软件模拟IIC下
1.发送ack 函数
void iicSendAck(void) //ack
{
SDA = 0;
Delay2us();
SCL = 1;
Delay2us();
SCL = 0;
Delay2us();
}
void iicSendNoAck(void) //noack
{
SDA = 1;
Delay2us();
SCL = 1;
Delay2us();
SCL = 0;
Delay2us();
}
2.接收ack指令
void iicDengAck(void) //等到从机ACK1是不应答0是应答
{
SDA = 1;
Delay2us();
SCL = 1;
Delay2us();
ack = SDA;
Delay2us();
SCL = 0;
Delay2us();
}
3.发送一个字节
void iicSendOne(u8 dat) //发送一个字节
{
u8 i=8;
SCL = 0;
do
{
if( dat& 0x80 )
SDA = 1;
else
SDA = 0;
Delay2us();
dat<<=1;
SCL = 1;
Delay2us();
SCL = 0;
Delay2us();
}
while(--i);
}
。。。。换楼太长了不好编辑
zhange
发表于 2024-5-21 16:27:45
本帖最后由 zhange 于 2024-5-21 16:33 编辑
第三十集:软件模拟IIC下 二接上
看老师视频和代码开始的SCL = 0;都没写也可以用不知道咋回事? 我研究下
看了下代码应答的时候已经把SCL拉低了
1.接受一个字节
u8 iicDuOne(void) //读取一个字节
{
u8 i=8,dat=0;
SCL = 0;
SDA = 1;
do
{
SCL = 1;
Delay2us();
dat<<=1;
if( SDA )
dat |= 1;
SCL = 0;
Delay2us();
}
while(--i);
return dat;
}
zhange
发表于 2024-5-22 06:54:20
本帖最后由 zhange 于 2024-5-22 16:23 编辑
第三十一集:硬件IIC
1.硬件iic功能脚不能随便选择,有四组可以选择。
默认的为001.5和1.4
2.添加模式选择代码
#if mode == 0
#elif mode == 1
#elif mode == 2
#endif
3.不确定优先级就加上()。
4.硬件的通信协议一般需要初始化,不要忘了调用初始化函数。
5.初始化函数
void iicInit(void)
{
P_SW2 = P_SW2 | 0x10;//选择功能脚 2.5 2.4
I2CCFG = 0xe0; //使能主机模式
I2CMSST = 0x00; //设置主机空闲状态
}
6.等待系统执行完命令 为了兼容 模拟的iic 用的延时函数
void Delay2us(void) //@22.1184MHz
{
while( !(I2CMSST & 0X40) );
I2CMSST &= (~0X40);
}
7.开始结束应答函数
void iicStart(void) //开始
{
I2CMSCR = 0X01; //开始命令
Delay2us();
}
void iicStop(void) //结束
{
I2CMSCR = 0X06; //结束命令
Delay2us();
}
void iicSendAck(void) //ack
{
I2CMSST = 0X00; //发送aCK
I2CMSCR = 0X05; //aCK命令
Delay2us();
}
void iicSendNoAck(void) //noack
{
I2CMSST = 0X01; //发送naCK
I2CMSCR = 0X05; //aCK命令
Delay2us();
}
void iicDengAck(void) //等到从机ACK1是不应答0是应答
{
I2CMSCR = 0X03; //接收aCK
Delay2us();
}
void iicSendOne(u8 dat) //发送一个字节
{
I2CTXD = dat; //发送的数据写入寄存器
I2CMSCR = 0X02; //发送
Delay2us();
}
u8 iicDuOne(void) //读取一个字节
{
I2CMSCR = 0X04; //发送
Delay2us();
return I2CRXD;
}
zhange
发表于 2024-5-22 16:25:17
本帖最后由 zhange 于 2024-5-22 16:26 编辑
第三十一集:硬件IIC 2
我这里写的是开机次数的存储和读取,直接读写的地址0
// 发送开始命令 发送器件地址(写) 发送数据地址 发送开始命令 发送器件地址(读)读数据
void IIC_Read_NByte(unsigned char *p,unsigned char number) //iic读取连续的几个字节
{
iicStart();
iicSendOne(0xa0);
iicDengAck();
iicSendOne(0);
iicDengAck();
iicStart();
iicSendOne(0xa1);
iicDengAck();
do
{
*p = iicDuOne(); //P => P
p++;
if( number!=1 )
iicSendAck();
}
while(--number);
iicSendNoAck();
iicStop();
}
void IIC_Write_NByte(unsigned char *p,unsigned char number ) //iic写入连续的几个字节
{
iicStart();
iicSendOne(0xa0);
iicDengAck();
iicSendOne(0);
iicDengAck();
do
{
iicSendOne(*p);
p++;
iicDengAck();
}
while(--number);
iicStop();
}
zhange
发表于 2024-5-22 16:27:42
手里现在有2个屏幕看一个是iic协议 玩玩 再看教程。。。{:4_165:}{:4_165:}{:4_165:}
小涵子爸爸
发表于 2024-5-24 08:26:59
看看硬件IIC与软件模拟IIC的区别