|
写过S3C2440对AT24C08读写的朋友的朋友看一下这个问题
[复制链接]
最近由于想写一个基于Linux的AT24C08驱动程序,所要就先写了一下裸机的驱动,主要完成S3C2440通过IIC总线对AT24C08进行读、写操作,其中写有两种方式:1)指定地址写;2)页写; 而读有三种方式:1)读当前地址;2)读指定地址;3)页读方式。搞了差不多一个星期了,一直还没有成功,都完全按其时序来书写程序的。由于本人没用仿真器,所以不知道这个程序错在什么地方。如果各位朋友有做过与我一样的程序,请送一个给小弟试试,看看是什么原因。
email: sw_2006.1230@163.com
看了开发板(Mini2440)提供的例子,感觉是在什么地方抄的,在网上找到的都是与开发板提供的一样的例子,没有一个其它的,也不知道最初版本是谁写的,不知道是我理解错还是什么原因,我感觉里面有一个重大的错误在于rGPECON的设置上。因为IIC的SDA,SCL分别为GPE15与GPE14,而例程在进行GPIO口的初始化时为 rGPECON |= 0xA00000; 这不是把GPE14,GPE15设置为IIC端口,同时,GPE14,GPE15端口没有上端口上拉电阻,而例子中把rGEPUP 初始化为 rGPEUP |= 0xC000; 在2440中rGPEUP的有效位只为14位,这样初始有用吗?
下面是本人的代码,请给予指正。
- /************************************************
- *说明:本程序是S3C2440 IIC总线的一个简单的驱动程序
- * 由于本程序比较简单,所以,在此不再进行说明,
- * 有不懂的读者请自行阅读相关文档。
- *
- * AT24C08 的地址格式为: 1 0 1 0 A2 P1 P0 W/R
- * A2为设备地址位、P1,P0为片内页寻址 LSB=0 写
- * LSB=1 读
- *
- *CPU :S3C2440
- *编译环境 :ADS1.2
- *开发板 :MINI2440
- *作者 :舒稳
- *部门 : 长沙理工大学
- * 计算机与通信工程学院
- * 计算机07级04班
- *最后修改时间 :开发中
- ************************************************/
- #ifndef _MY_IIC_C_
- #define _MY_IIC_C_
- #include "../include/2440addr.h"
- #include "../include/2440lib.h"
- #include "../include/def.h"
- #include "../include/My_IIC.h"
- static int seave_gpecon;
- /*用于保存GPECON的当前值,为恢复GPECON做准备*/
- U8 write_buffer[16];
- /*写缓冲区*/
- U8 read_buffer[16];
- /*读缓冲区*/
- /*初始化GPIO*/
- void
- _init_gpio(void)
- {
- seave_gpecon = rGPECON;
-
- rGPECON = 0xA0000000;
- }
- /*恢复GPIO口*/
- void
- _resume_gpio(void)
- {
- rGPECON = seave_gpecon;
- }
- /*初始化IIC总线*/
- void
- _init_iic(void)
- {
- /*
- *IIC应答使能有效、IICCLK = FPCLK/16、
- *清除挂取条件、 TXCLK = IICCLK/16
- */
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- rIICSTAT = 0x10;
- rIICADD = 0x10;
- rIICLC = (1<<2)|(1);
- }
- /*
- *写一个字节到指地址单元
- *@device_address:从机地址
- *@word_address:要写入的单元地址
- *@data:要写入的数据
- */
- /*通过测试*/
- void
- _byte_write(U8 device_address, U8 word_address, U8 data)
- {
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- rIICSTAT = (rIICSTAT & 0x0) | (0x1 << 7) | (0x1 << 6);
- rIICDS = device_address;
- rIICSTAT = 0xF0;
- while((rIICSTAT & 0x01) == 1);
-
- rIICDS = word_address;
- while((rIICSTAT & 0x01) == 1);
-
- rIICDS = data;
- while((rIICSTAT & 0x01) == 1);
- rIICSTAT = 0xD0;
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- }
- /*
- *以页写的方式写入AT24C08中
- *@device_address:从机地址
- *@word_start_address:要写入的首地址
- *@buffer_start_address:要写入的数据的缓冲区首地址
- */
- /*通过测试*/
- void _page_write(U8 device_address, U8 word_start_address,U8 *buffer_start_address)
- {
- unsigned int i;
-
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- rIICSTAT = (rIICSTAT & 0x0) | (0x1 << 7) | (0x1 << 6);
- rIICDS = device_address;
- rIICSTAT = 0xF0;
- while((rIICSTAT & 0x01) == 1);
-
- rIICDS = word_start_address;
- while((rIICSTAT & 0x01) == 1);
-
- for(i = 0; i < 15; i ++){
- rIICDS = *(buffer_start_address + i);
- while((rIICSTAT & 0x01) == 1);
- }
-
- rIICDS = *(buffer_start_address + i);
- while((rIICSTAT & 0x01) == 1);
-
- rIICSTAT = 0xD0;
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- }
- /*
- *读当前地址单元的内容
- *@device_address:从机地址
- *返回值:读取到的字节
- */
- /*通过测试*/
- U8
- _current_address_read(U8 device_address)
- {
- U8 data;
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- rIICSTAT = (rIICSTAT &0x0) | (0x1 << 7) | (0 << 6);
- rIICDS = device_address;
- rIICSTAT = 0xB0;
- while((rIICSTAT & 0x01) == 1);
- rIICCON = (0 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- data = rIICDS;
-
- rIICSTAT = 0x90;
-
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
-
- return data;
- }
- /*
- *读指定单元地址的内容
- *@device_address:从机地址
- *@word_address:指定的要读取的地址单元
- *返回值:读取到的字节
- */
- /*有误,需要修改*/
- U8
- _random_address_read(U8 device_address, U8 word_address)
- {
- U8 data;
-
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- rIICSTAT = (rIICSTAT & 0x0) | (0x1 << 7) | (0x1 << 6);
- rIICDS = device_address & 0xFE;
- rIICSTAT = 0xF0;
- while((rIICSTAT & 0x01) == 1);
-
- rIICDS = word_address;
- while((rIICSTAT & 0x01) == 1);
-
-
- rIICSTAT = (rIICSTAT & 0x0) | (0x1 << 7) | (0 << 6);
- rIICDS = device_address;
- rIICSTAT = 0xB0;
- while((rIICSTAT & 0x01) == 1);
-
- rIICCON = (0 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- data = rIICDS;
-
-
- rIICSTAT = 0x90;
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
-
- return data;
- }
- /*
- *以页读的方式进行读取
- *@device_address:从机地址
- *@word_address:起始地址
- *@buffer_start_address:读取缓冲区首地址
- */
- /*有误,需修改*/
- void
- _sequential_address_read(U8 device_address,U8 word_address,U8 *buffer_start_address)
- {
- unsigned i;
-
-
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- rIICSTAT = (rIICSTAT & 0x0) | (0x1 << 7) | (0x1 << 6);
- rIICDS = device_address & 0xFE;
- rIICSTAT = 0xF0;
- while((rIICSTAT & 0x01) == 1);
-
- rIICDS = word_address;
- while((rIICSTAT & 0x01) == 1);
-
- rIICSTAT = (rIICSTAT & 0x0) | (0x1 << 7) | (0 << 6);
- rIICDS = device_address;
- rIICSTAT = 0x90;
- while((rIICSTAT & 0x01) == 1);
-
- for(i = 0; i < 15; i ++){
- *(buffer_start_address + i) = rIICDS;
- _delay_time(3);
- }
- rIICCON = (0 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- *(buffer_start_address + i) = rIICDS;
- rIICSTAT = 0x90;
- rIICCON = (1 << 7) | ( 0 << 6) | (0 << 5) | (0xF);
- }
- /*
- *进行一小段延时
- *@delay_time:要进行的延时
- */
- void
- _delay_time(unsigned int delay_time)
- {
- while(delay_time --);
- }
- /*测试程序*/
- void
- _test_iic(void)
- {
- char i;
-
- /*实始化读 写缓冲区*/
- for( i = 0; i < 16; i ++){
- *(write_buffer + i) = i * 2;
- *(read_buffer + i )= 0;
- }
-
- /*下面为测试按页写测试*/
-
- _page_write(DEVICE_ADDRESS_WRITE,0,write_buffer);
- _delay_time(500);
-
- for(i = 0; i < 16; i ++){
- Uart_Printf("%d %d %d\n",i + 1,_random_address_read(DEVICE_ADDRESS_READ,i),_current_address_read(DEVICE_ADDRESS_READ));
- _delay_time(500);
-
- }
-
-
-
- for(i = 0; i < 16; i ++){
- _byte_write(DEVICE_ADDRESS_WRITE, i,i * 3);
- _delay_time(500);
-
- }
-
- for(i = 0; i < 16; i ++){
- Uart_Printf("%d %d %d\n",i + 1,_random_address_read(DEVICE_ADDRESS_READ,i),_current_address_read(DEVICE_ADDRESS_READ));
- _delay_time(500);
-
- }
-
- /*下面为测试按页读*/
- _sequential_address_read(DEVICE_ADDRESS_READ,0,read_buffer);
- _delay_time(500);
-
-
- for(i = 0; i < 16; i ++)
- Uart_Printf("%d %d\n",i + 1,*(read_buffer + i));
-
-
-
- Uart_Printf("\n");
- }
- #endif
- /************************************************
- ||
- ||
- ||
- || END My_IIC.c
- ||
- ||
- ||
- ************************************************/
复制代码
|
|