[英]ATMEGA32 UART Communication
我正在尝试在ATMEGA32中进行串行通信,但我有一个问题:
在异步串行通信中, UBRRH
和UCSRC
寄存器都位于同一位置。 我不知道该位置的哪些条件将充当UBRRH
,对于哪些条件,它将充当UCSRC
。 根据分配给这些寄存器的工作,我需要为每个寄存器使用不同的值
在数据表中,他们提到了在两个寄存器之间进行选择时使用URSEL
位,但以某种方式我没有得到。
答案是:是的, URSEL
位。 根据数据表:
在对该I / O位置进行写访问时,写入值的高位USART寄存器选择(URSEL)位控制将要写入的两个寄存器中的哪一个。 如果在写操作期间URSEL为零,则将更新UBRRH值。 如果URSEL为1,则UCSRC设置将被更新。
这意味着,无论您要向UCSRC
写入什么值,都应将URSEL
位置1(确保URSEL
为1
):
UCSRC = (1<<URSEL)| ... whatever else ...
当您写入UBRRH
,请确保URSEL
位必须为零。 这是一些不同的方法:
UBRRH = (0<<URSEL)| ... whatever else ... // just showing that URSEL isn't set
UBRRH = ...some value... // simple not setting URSEL
UBRRH = (someValue)&(~(1<<URSEL) // Ensuring that URSEL isn't set
URSEL
位只是高位。 因此,无论您写入UCSRC
值,都将高位(位7)设置(打开,使1
)。 并且在写入UBRRH
,请确保清除了第7位。 另一种思考的方式是,您写入UBRRH
每个值都必须小于128。要将您要写入UCSRC
每个值都加128:它将打开第7位。这只是一种解释方式,上面的代码更加清晰。
怎么做? 我不知道,我不是uC设计师。 可能是相同的IO位置映射到了处理器中的两个不同的寄存器。 假设您有一个名为foo
的寄存器,当您向其写入值时,uC会检查高位是否已设置。 如果是,则将值写入内部存储器位置1
;如果不是,则将值写入内部存储器位置2
。
如果正确使用了URSEL
位,则表示这些值已正确写入。 您的测试未显示正确的值,因为您没有正确阅读它们。 数据表的第162页:
对UBRRH或UCSRC寄存器进行读访问是一个更复杂的操作。 但是,在大多数应用中,几乎不需要读取任何这些寄存器。
读取访问由定时序列控制。 读取I / O位置一次将返回UBRRH寄存器的内容。 如果在先前的系统时钟周期中读取了寄存器位置,则在当前时钟周期中读取寄存器将返回UCSRC内容。 请注意,读取UCSRC的定时序列是原子操作。 因此,在读取操作期间必须控制中断(例如,通过全局禁用中断)。
因此,当您第一次阅读UBRRH
/ UCSRC
时,您会得到UBRRH
。 如果您立即再次阅读,则会阅读UCSRC
。 但是,正如文档所建议的那样,没有真正的理由来读取这些寄存器。 似乎您不信任数据表,但这是一个错误:数据表是有关此类问题的最佳信息来源:没有数据表,我们将无处可寻。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.