使用stm32的io模拟方式操作can控制器sja1000
2014-11-14 16:42
459 查看
sja1000是一款独立的can控制器芯片,对它的操作很像操作外部存储器,8位地址数据复用线AD0~AD7,WR,RD,ALE,CS。
原本是使用stm32的fsmc来操作sja1000的,发现总有一两个寄存器数据读出来和写入的不一样,所以才改用io口模拟方式操作sja1000(别问我为什么不直接使用stm32的can控制器,因为项目需要没办法,不然stm32自带的can控制器这么好用为什么不用呢!!!)。
进入正题,贴上操作部分的源码!
void WriteSja1000(u8 addr,u8 data)
{
CLR_SJA1000_CS;
SET_DATA(addr);
SET_SJA1000_RS;
delay(10);
CLR_SJA1000_RS;
SET_DATA(data);
CLR_SJA1000_WR;
delay(10);
SET_SJA1000_WR;
SET_SJA1000_CS;
}
u8 ReadSja1000(u8 addr)
{
u8 DATA = 0;
SET_DATA(addr);
CLR_SJA1000_CS;
SET_SJA1000_RS;
delay(10);
CLR_SJA1000_RS;
CLR_SJA1000_RD;
delay(10);
DATA = GET_DATA();
SET_SJA1000_RD;
SET_SJA1000_CS;
return DATA;
}
void SET_DATA(u8 data)
{
DATALINE_OUT();//设置AD0~AD7对应的io为输出
(data & (1 << 7)) ? (GPIOE->BSRR = (1 << 10)): (GPIOE->BRR = (1 << 10));
(data & (1 << 6)) ? (GPIOE->BSRR = (1 << 9)): (GPIOE->BRR = (1 << 9));
(data & (1 << 5)) ? (GPIOE->BSRR = (1 << 8)): (GPIOE->BRR = (1 << 8));
(data & (1 << 4)) ? (GPIOE->BSRR = (1 << 7)): (GPIOE->BRR = (1 << 7));
(data & (1 << 3)) ? (GPIOD->BSRR = (1 << 1)): (GPIOD->BRR = (1 << 1));
(data & (1 << 2)) ? (GPIOD->BSRR = (1 << 0)): (GPIOD->BRR = (1 << 0));
(data & (1 << 1)) ? (GPIOD->BSRR = (1 << 15 )): (GPIOD->BRR = (1 << 15 ));
(data & (1 << 0)) ? (GPIOD->BSRR = (1 << 14 )): (GPIOD->BRR = (1 << 14 ));
}
u8 GET_DATA()
{
u8 data = 0;
DATALINE_IN();//设置AD0~AD7对应的io为输入
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_14) == 1)
{
data |= 0x01;
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15) == 1)
{
data |= 0x02;
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) == 1)
{
data |= 0x04;
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) == 1)
{
data |= 0x08;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7) == 1)
{
data |= 0x10;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8) == 1)
{
data |= 0x20;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9) == 1)
{
data |= 0x40;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10) == 1)
{
data |= 0x80;
}
return data;
}
原本是使用stm32的fsmc来操作sja1000的,发现总有一两个寄存器数据读出来和写入的不一样,所以才改用io口模拟方式操作sja1000(别问我为什么不直接使用stm32的can控制器,因为项目需要没办法,不然stm32自带的can控制器这么好用为什么不用呢!!!)。
进入正题,贴上操作部分的源码!
void WriteSja1000(u8 addr,u8 data)
{
CLR_SJA1000_CS;
SET_DATA(addr);
SET_SJA1000_RS;
delay(10);
CLR_SJA1000_RS;
SET_DATA(data);
CLR_SJA1000_WR;
delay(10);
SET_SJA1000_WR;
SET_SJA1000_CS;
}
u8 ReadSja1000(u8 addr)
{
u8 DATA = 0;
SET_DATA(addr);
CLR_SJA1000_CS;
SET_SJA1000_RS;
delay(10);
CLR_SJA1000_RS;
CLR_SJA1000_RD;
delay(10);
DATA = GET_DATA();
SET_SJA1000_RD;
SET_SJA1000_CS;
return DATA;
}
void SET_DATA(u8 data)
{
DATALINE_OUT();//设置AD0~AD7对应的io为输出
(data & (1 << 7)) ? (GPIOE->BSRR = (1 << 10)): (GPIOE->BRR = (1 << 10));
(data & (1 << 6)) ? (GPIOE->BSRR = (1 << 9)): (GPIOE->BRR = (1 << 9));
(data & (1 << 5)) ? (GPIOE->BSRR = (1 << 8)): (GPIOE->BRR = (1 << 8));
(data & (1 << 4)) ? (GPIOE->BSRR = (1 << 7)): (GPIOE->BRR = (1 << 7));
(data & (1 << 3)) ? (GPIOD->BSRR = (1 << 1)): (GPIOD->BRR = (1 << 1));
(data & (1 << 2)) ? (GPIOD->BSRR = (1 << 0)): (GPIOD->BRR = (1 << 0));
(data & (1 << 1)) ? (GPIOD->BSRR = (1 << 15 )): (GPIOD->BRR = (1 << 15 ));
(data & (1 << 0)) ? (GPIOD->BSRR = (1 << 14 )): (GPIOD->BRR = (1 << 14 ));
}
u8 GET_DATA()
{
u8 data = 0;
DATALINE_IN();//设置AD0~AD7对应的io为输入
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_14) == 1)
{
data |= 0x01;
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15) == 1)
{
data |= 0x02;
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) == 1)
{
data |= 0x04;
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) == 1)
{
data |= 0x08;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7) == 1)
{
data |= 0x10;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8) == 1)
{
data |= 0x20;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9) == 1)
{
data |= 0x40;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10) == 1)
{
data |= 0x80;
}
return data;
}
相关文章推荐
- STM32IO口8位操作移位的方式
- 使用面向对象的方式模拟TOM使用ATM进行存取款的操作
- STM8S003F使用IO口模拟串口(三)使用中断方式发送和接收数据
- 使用面向对象的方式模拟TOM使用ATM进行存取款的操作
- 【程序】STM32使用SPI接口操作93C46存储器(非软件模拟)
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
- 树莓派使用文件IO操作GPIO SysFs方式
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
- STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)
- STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)
- 使用文件IO操作GPIO SysFs方式
- STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)
- 在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容
- Access数据库:它已经被别的用户以独占方式打开,操作必须使用一个可更新的查询,不能锁定文件
- Mocha BSM端到端响应时间管理——模拟用户使用方式
- 一个项目中使用到的通用函数库(3) 文件IO操作!
- 数据库中各种操作方式累积。这个主要是测试显示使用多种方法
- 以编程方式使用批语句节省 数据库IO来提高性能
- VC++中使用ADO方式操作ACCESS数据库
- 使用wscript来模拟键盘操作