中斷處理程序
為蘆山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及蘆山網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都做網(wǎng)站、蘆山網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!{
清除中斷
硬件自動清除
軟件清除
}
CPU芯片手冊相關(guān)章節(jié)
————————
I2C
CPU外接設(shè)備的方式
1)GPIO簡潔的方式(按鍵,LED)
通過設(shè)置GPIO管腳的狀態(tài)來完成通信(控制)
gpccon
gpcpud
gpcdat
2)類似于內(nèi)存的接口 (DDRAM norflash nand dm9000)
從硬件上看CPU和芯片 數(shù)據(jù)線 地址先 BANK
3)協(xié)議類接口
uart
I2C
AT24C02 EEPROM
3,如何解決CPU和設(shè)備通信的問題
I2C通信協(xié)議:定義:兩線式串行總線 SCL:時鐘線 SDA:數(shù)據(jù)線
通信過程中使用到的信號
start:處于高電平 在SCL處于高電平SDA有個下降沿;
stop:處于低電平 在SCL處于高電平SDA有個上升沿;
ACK: 應(yīng)答信號,在SCL處于高電平SDA為低電平時;
在SCL可以變數(shù)據(jù),在SCL為高不能改變SDA
I2C通信特點
I2C通信過程中,設(shè)備之間有主從之分。
在開發(fā)板上I2C總線上的主設(shè)備就是CPU(可配置)
掛在I2C總線上的其他 芯片統(tǒng)統(tǒng)是從設(shè)備
I2C通信的發(fā)起者肯定是主設(shè)備
I2C總線上的每個從設(shè)備都有一個固定的地址。
4.EEPROM驅(qū)動開發(fā)
AT24C02容量,結(jié)合原理圖,找到開發(fā)板上的地址,如何寫(讀)一個字節(jié)到該芯片
2Kbits 256字節(jié) 1010xxxx
寫
start信號
7位地址+w
等待應(yīng)答
word address:發(fā)送要寫入的地址
等待應(yīng)答
發(fā)送即將寫入的數(shù)據(jù)
等待應(yīng)答
產(chǎn)生信號
讀:
START信號
從設(shè)備地址+w
等待信號
start信號
發(fā)從設(shè)備內(nèi)存地址—R
等待ACK
接收從設(shè)備發(fā)送的字節(jié)的數(shù)據(jù)
第九周期兩種方式:回復(fù)ACK 第10周期 從設(shè)備繼續(xù)發(fā)送下一個存儲的數(shù)據(jù)
不發(fā)ACK 第10周期設(shè)備休息
主設(shè)備 STOP
cpu里有個I2C core.c
我們要做的就是實現(xiàn)device i2c_client
i2c_new_device 在鏈表加上節(jié)點
device_driver i2c_driver i2c_add_driver 在鏈表添加節(jié)點
然后調(diào)用下match函數(shù)執(zhí)行probe函數(shù) 再通過I2C協(xié)議完成CPU和芯片的通信
AT24C02驅(qū)動程序
按照總線驅(qū)動模型來寫
實現(xiàn)一個i2c_client 和
i2c_driver
{
要訪問AT24C02
調(diào)用I2C控制器啟動程序(數(shù)據(jù)交互)
}
I2C控制器的驅(qū)動程序(內(nèi)核中已實現(xiàn)了)
send
recv
AT24C02程序
添加i2c_cliend
Documentation\i2c\instantiating-devices
vi arch/arm/mach-xxxxxx/mach-xxxxx.c
static stuct i2c_board_info i2c_at24cxx[] =
{
{I2C_BOARD_INFO("at24cxx",0x50)
},
};
c參數(shù)1:名稱 參數(shù)二:從設(shè)備地址
i2c_register_board_info(0,i2c_at24cxx,ARRAY_SIZE(i2c_at24cxx));
解釋:0:cpu的I2C不止一個,也就是有很多i2c接口,看原圖看看它掛在哪個接口 才確定是幾
2)添加driver
i2c_transfer()i2c收發(fā)數(shù)據(jù)函數(shù)
AT24C02模塊主要程序:
#include <linux/i2c.h>
#include <linux/uaccess.h>
dev_t dev;
struct艾24cxxx_dev
{
struct cdev cdev;
struct i2c_client *client;
}
struct class *dev_class = NULL;
struct device dev_device NULL;
struct at24cxx_dev *at24cxx_devp =NULL;
static int xxxxxx_prob (struct i2c_client *client,const struct i2c_device_id *id)
{
申請設(shè)備號
alloc_chrdev_region(&dev,0,"xxxxx");
申請cdev空間
at24cxx_devp =kzalloc(sizeof(struct at24cxx),GFP_KERNEL);
at24cxx_devp->client =clirnt;
初始化cdev并添加到內(nèi)核
cdev_init(&at24cxx_devp->cdev,&ar24cxx_fops);
cdev_add(at24cxx_devp->cdev,dev,1);
創(chuàng)建設(shè)備節(jié)點文件
dev_class-class_create(THIS_...,"AT24CXX");
dev_device = device_create(dev_class,NILL,dev
NULL,"AT24CXX0");
}
int at24cxx_remove(struct i2c_client *client)
{
device_destroy()dev_class,dev);
class_destroy(dev_class);
cdev_del(&at24cxx_devp);
kfree(at24cxx_devp);
unregister_chrdev_region(dev,1);
return 0;
}
static size_t at24cxx_write(struc file *file,char __user buf,size_size,loff_t *offset)
{
unsigned char val[2];
struct i2c_msg msg[1];
int ret =0;
if(size ! -2)
{
return -1
}
copy_from_user(。。。);
msg[0].add=at24cxx->client->addr//從設(shè)備地址
msg[0].flags=0;//寫入
msg[0].buf =val;//數(shù)據(jù)
msg[0].len =2;
//START ....ADDR+W ACK offset ACK val ACK
i2c_transfer( ar24cxx_devp->client->adapter,msg,1);//內(nèi)核創(chuàng)建的adapter 在
//i2c_register_board_info()中;
return 2;
}
static ssize_t xxxx_read(struc file *file,char __user buf,size_size,loff_t *offset)
{
unsigner char address;
unsigned char data;
struct i2c_msg msg[2];
int ret;
ret = copy_form_user(&address,buf,1);
msg[0].addr=at24cxx_devp->client->addr;
msg[0]=flags = 0;
msh[0].buf=&address;
msh[0].len =1;
msg[0].addr=at24cxx_devp->client->addr;
msg[0]=flags = 1;//讀信號
msh[0].buf=&data;
msh[0].len =1;
i2c_transfer( ar24cxx_devp->client->adapter,msg,ARRAY_SIZR(msg));//內(nèi)核創(chuàng)建的adapter 在
//i2c_register_board_info()中;
ret =cop_to_user();
}
struct filr_operations at24cxx_fops =
{
.owner = ....,
.read = at24cxx_read,
.write = at24cxx_write,
}
const struct i2c_device_id id_table[] =
{
{"at24cxx",0},
{ }//結(jié)束標(biāo)志
}
struct i2c_driver at24cxx_driver =
{
.driver=
{
.name="AT24C02"
.owner=...
},
.probe = xxxxxxxxxx,
.remove = xxxxxxxxxx,
.id_table = at24cxx_id //i2c match 會使用到,來匹配能支持那些設(shè)備
};
__int
i2c_add_driver(&at24cxx_driver);
__exit
i2c_del_driver(&at24cxx_driver);
測試程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/typer,h>
#include <sys/stat.h>
#include <fcntl.h>
void print_rsage(char*file)
{
printf("%s r addr\n"file);
printf(% w addr val\n,file);
}
int main (int argc , char **argv)
{
int fd;
unsigned char buf[2];
if(argc!=3 &&argc!=4)
{
print_usage(argv[0]);
return -1;
}
fd=open(/dev/ar24cxx0",O_RDWR)
if(strcmp(argv[1],"r")==0)
{
buf[0]=strtoul(artoul[2],NULL,0);
read(fd,buf,1);
peintf(data %c %s 0x%2x\n,buf[0]....);
}
else if(sstrcmp(argv[1],"w")==0)
{ buf[0]=strtoul(artoul[2],NULL,0);
buf[1]=strtoul(artoul[3],NULL,0);
write(fd,buf,2);
}
else
{
print_usage(argv[0]);
return -1
}
return 0;
}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文題目:I2C總線介紹及AT24C02驅(qū)動編寫筆記-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://muchs.cn/article38/pgopp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站維護、營銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、軟件開發(fā)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容