举例 有一颗使用SPI通讯的 ADC
他的命令方式是
http://images.plurk.com/d7li-6YnNNlTPMCq7nnLMgjUdDx.jpg
.h会这样写(以下为虚拟码)
#define READ 1
#define WRITE 0
#define SYS 0 //RW传8bit
#define ADC 1 //RW传16bit
#define ADO0 2 //R传24bit
#define ADO1 4 //R传24bit
#define TS 6 //R传16bit
....etc
由这样可以知道命令为8位元资料
例如下SYS读取
则只要送出
0b10000000接着送8bit的clock把资料拖回来
那程式我只要写
if(ADC_COMMAND(READ, SYS, false))
{
8bit读取放在这
}
就快快乐乐的下好命令等著抓资料了
函式为
bool ADC_COMMAND(const unsigned char RW,
const unsigned char Adds,
bool CNCR)
{
if(Adds >= 0b1000)
return false; //传输命令不合法
volatile int Commd = 0;
Commd = Adds << 4;
if(CNCR)
BSF(Commd, 3);
if(RW)
BSF(Commd, 7);
ADC_CSLOW();
SPI_TxBuffer = Commd; //送出
while(GETBIT(SPI_SET1, SPI_TxBF)); //等待送出完成
ADC_CSHIGH();
return true;
}
※ 引述《Acekirisame (达陆趁现在!)》之铭言:
: 如前题,这段时间在忙其他工作,尚未对MCU CODING
: 但是这段时间还是有陆续问有在接触MCU的同学问问题,
: 也感谢之前K版友的详细回复,现在我目前想确认之前的
: 一些问题,如下网址里面的图,这是MCU欲控制的IC,这是
: 该IC里面的一些暂存器(有包含位址跟读写,后面的SPEC
: 还有说明各BIT的作用)
: http://i.imgur.com/2iH0YFZ.jpg
: 写C++时,我参考K版友的参考CODE后我定义了上述暂存器:
: #define SYSTEM (*(unsigned int *)0x01)
: #define SYSTEM_OPER (*(unsigned int *)0x02)
: #define EXTERNAL_MOS (*(unsigned int *)0x03)
: #define WAKE_UP_SOURCE_DFM_SET (*(unsigned int *)0x04)
: #define DFMONITOR (*(unsigned int *)0x05)
: #define WATCHDOG_CONF (*(unsigned int *)0x06)
: #define RESERVED_W (*(unsigned int *)0x07)
: #define LINBITS_SET (*(unsigned int *)0x08)
: #define DRV_SET (*(unsigned int *)0x09)
: #define RESRVED (*(unsigned int *)0x0A)
: #define TEST_STAT (*(unsigned int *)0x0B)
: #define WATCHDOG_REFRESH (*(unsigned int *)0x0F)
: #define WAKE_UP_SOURCE (*(unsigned int *)0x11)
: #define LAMP_STAT (*(unsigned int *)0x12)
: #define PH_SENSE (*(unsigned int *)0x13)
: #define WD_TS_RES_CNT (*(unsigned int *)0x14)
: #define DEVICE_INFO (*(unsigned int *)0x1F)
: 不知道这样定义后对不对,假使是对的话,我就会开始用他们的
: 内建的SPI INTERFACE去读写该颗IC的暂存器的值,
: 不过要了解他们的library的SPI传送资料的副程式又是另一个问
: 题了...