【S3C2440】第19课、I2C之学习笔记

说明:2440芯片可以作为主控芯片,也可以作为从设备,但是我们只关心其作为主控芯片的情景。

1、ACK信号是接收器硬件自己发出的还是我们软件程序发出的?
答:由硬件自动标记寄存器IICSTAT'[0]_ACK位的!

2、INT_IIC中断产生的时间?
答:发送 IICDS 的数据;————ACK 阶段并且接着挂起中断;

3、Tx mode 是 Byte Write mode, 的 msg 是一条多字节还是仅仅一个字节?
答:1)Tx mode 是 Byte Write mode, 一次只在一个 WordAddress 写入一个字节data!
2)Byte Write mode下,一次写操作只写一个msg(内含一个 WordAddress及其对应的一个字节data),然后把SDRAM中的字符串str的字符通过循环操作,
一个字节构建为一个msg并进行一次写操作,该次写msg操作结束后退出,然后循环写操作,可实现写字符串到I2C内存设备。
3)在 at24cxx_wrtie(); 函数内传输的 msg 的缓冲内存 buf[] 一次发送仅仅两个字节,一个msg的数据缓冲器buf中两个字节的数
   据; word_address和data1; 
   然后再次调用 master_xfer() 函数发出 STAT 信号; 发出写入 DeviceAddr 后进入中断并循环等待; 进入中断并判断 应答信号
   ACK,若应答则再次写入 WordAddr 然后循环等待中断处理; 进入中断并判断 应答信号 ACK,若应答则再次写入 data 然后等待
   进入中断并循环等待; 进入中断并判断 应答信号 ACK 及 cnt_transferred < len(即2)是否成立,发出 STOP 信号; 
4)然后在 at24cxx_wrtie();函数内重新更新 WordAddr/buf[]/flags/cnt_transferred, 重组msg,然后再次调用master_xfer(); 
   发出 STAT 信号等等,如上。
问题:按照数据手册,每传一个字节的数据就需要判断一次ACK信号,但是视频为什么只在每次数据传输的第一次中断时进行了ACK
判断,而没有在余下的字节传输后判断ACK信号?
答:根据程序来看,Tx mode是只需要在第一次中断判断一次是否有I2C设备并正常工作就可以了,余下的读出/写入工作直接进行即可!
而Rx mode 则需要在结尾发出STOP信号之前设置 IICCON'[7]=0, 禁止ACK应答;
另,Rx mode中,传输信息时,两个msg,一个功能为:写入WordAddr; 另一个功能:读出数据到buf[];

4、读/写数据的格式?
答:根据 AT24CXX 的 Write/Read 时序图可知,可以在发出一个地址 word address 后连续写数据到 AT24CXX 的内存,可为什么视频程序写内存
是发一个地址,写一字节数据?应该是 Byte Write 格式的原因,至于连续读写操作,可以改变格式。方法呢?以后有时间了再探究,时间还是不够用啊!
相区别与之前学习的Nandflash章节,发一个地址到寄存器NFADDR,连续往里面写东西,s3c2440的寄存器即会自动烧写数据到从这个地址开始的一串内存了!
之前学习的Nandflash章节,发一个地址到寄存器NFADDR(2列3行5次),反复读寄存器NFDATA可得本页内该地址及之后的连续flash空间的内容; 
写同理,发一个地址到寄存器NFADDR(2列3行共5次),反复写数据到寄存器NFDATA即可把数据写入从该地址及之后的连续flash空间中。
复习补充: Byte Write mode下,每次只写操作一个msg(内含一个 WordAddress 及其对应的一个字节data),之后发出STOP信号,然后继续下一个msg;
Random Read mode下,每次读操作都有且只有两个msg,第一个msg为虚写 DeviceAddress 和 WordAddress,第二个msg为读操作,先把WordAddress写入IICDS
寄存器并触发 INT_IIC 中断,并在 INT_IIC 中断中连续从寄存器IICDS读数据到内存的buf[100]中,如此,即为只发一个字节地址WordAddress连续读可以读
到这个地址开始的连续的 IIC 设备空间的数据。

5、AT24C02的设备地址是 0x50 还是 0xa0/0xa1? 往2440的寄存器写的 AT24C02 的 DeviceAddress 地址 0x50 还是 0xa0/0xa1?
答:AT24C02的设备地址格式是7+1格式,总的是 0xa0/0xa1,即往2440的IICDS寄存器写的 AT24C02 的 DeviceAddress 地址是8位地址 0xa0/0xa1; 其中,7位
地址,1位传输方向位; 数据传输方向由 IICSTAT 寄存器的 bit[7:6] 决定??;

6、在i2c_controller.c中,注册2440的i2c控制器的时候,在register_i2c_controller(p_i2c_controller *p)中,形参上为什么不能设为p_i2c_controller p,
p_i2c_controller 定义的不就是一个指针了么?
答:本节视频的这个函数的形参有些问题,应该为register_i2c_controller(p_i2c_controller p);

7、对于 Tx mode 的 Byte Write 操作,只能写一次地址到寄存器 IICDS 然后写一个字节data到 寄存器IICDS; 
对于 Rx mode 的 Random Read 操作,写一次地址然后连续读寄存器IICDS,即可读到从这个地址开始的连续I2C_rom的内存数据; 

8、程序如下:

volatile unsigned char str[100];
volatile unsigned char *str2 = “123456”;
*str++;        *str2++;        ...


答:str是常量,如此使用会编译错误!!str2是指针变量,可以进行算数运算,以上均由vc++6.0编译器验证过。

9、unsigned char str[100] = {0};    
编译问题:i2c/i2c_test.o(.text+0x20): In function `do_write_at24cxx':
: undefined reference to `memset'

串口打印现象整理及解决:
1.write时,往 WordAddress = 0 写入 123456789123456789:Tx error! No ack!
分析:写成功了,但是返回的 ack 有问题!

2.Read时,不管输入的是什么 WordAddress, length是多大,打印结果都一样!

Data:
0032h: 31 32 33 34 35 36 37 38 39 31 32 33 34 35 36 37   ;1234567891234567
0042h: 38 39 00 00 d3 00 00 21 2a 00 00 00 0d 00 00 00   ;................
0052h: b0 ff ff 33 90 ff ff 33 9c 2f 00 30 d4 1b 00 30   ;................
0062h: 00 00 00 00 00 00 00 00 68 9c 20 20 d0 ff ff 33   ;h▒  ▒▒▒3


答:原因查找,是因为JZ2440开发板做I2C测试需要用I2C模块,而做实验时却没有安装模块。

10、对IIC设备,写时是字节写,读时是连续读,由此可知,对于IIC内存类设备,写操作比对于读操作谨慎的多!!

11、File: i2c_test.c中,

void do_write_at24cxx(void)
{
    ...
    err = at24cxx_write(addr, str, strlen(str)+1);
}


中,strlen(str)+1为什么要加1??
答:不知原因。

猜你喜欢

转载自blog.csdn.net/weixin_39420903/article/details/82842124
今日推荐